• 无向图的广度优先遍历


    #include <iostream>
    #include <stdio.h>
    using namespace std;
    #define MaxVertexNum 100
    typedef char VertexType;
    typedef int EdgeType;
    typedef int Datatype;
    typedef struct
    {
     VertexType vexs[MaxVertexNum];
     EdgeType edge[MaxVertexNum][MaxVertexNum];
     int n,e;
    }MGragh;
    typedef struct queuenode
    {
     Datatype data;
     struct queuenode *next;
    }QueueNode;
    typedef struct
    {
     QueueNode * front;
     QueueNode * rear;
    }LinkQueue;

    void InitQueue(LinkQueue *Q)
    {
     Q->front = Q->rear = NULL;
    }

    int QueueEmpty(LinkQueue *Q)
    {
     return Q->front == NULL && Q->rear == NULL;
    }

    void EnQueue(LinkQueue *Q,Datatype x)
    {
     QueueNode *p = (QueueNode*)malloc(sizeof(QueueNode));
     p->data = x;
     p->next = NULL;
     if(QueueEmpty(Q))
      Q->front = Q->rear = p;
     else
     {
      Q->rear->next = p;
      Q->rear = p;
     }
    }

    Datatype DeQueue(LinkQueue *Q)
    {
     Datatype x;
     QueueNode *p;
     if(QueueEmpty(Q))
      printf("Queue Empty");
     p = Q->front;
     x = p->data;
     Q->front = p->next;
     if(Q->rear == p)
     Q->rear = NULL;
     free(p);
     return x;
    }

    int visited[MaxVertexNum];
    void DFS(MGragh *G, int i);
    MGragh* CreateMGraph(MGragh **G)
    {
     int i,j,k,w;
     *G = (MGragh*)malloc(sizeof(MGragh));
     printf("请输入顶点数和边数:");
     scanf("%d%d",&((*G)->n), &((*G)->e));
     fflush(stdin);
     printf("请输入顶点值:(中间不要有空格如:ABCDEF) ");
     for(i = 0; i< (*G)->n ;i++)
      (*G)->vexs[i] = getchar();
     for(i = 0; i < (*G)->n; i++)
      for(j = 0; j<(*G)->n; j++)
       (*G)->edge[i][j] = 0;
     fflush(stdin);
     printf("请输入(Vi,Vj)上的权w: ");
     for(k = 0; k < (*G)->e; k++)
     { 
      scanf("%d%d%d",&i,&j,&w);
      (*G)->edge[i][j] = w;
      (*G)->edge[j][i] = w;
     }
     return *G;

    }

    void DisMGraph(MGragh *G)
    {
     int i,j;
     for(i =0;i<G->n;i++)
     {
      printf(" ");
      for(j=0;j<G->n;j++)
       printf(" %d ",G->edge[i][j]);
      printf(" ");
     }
    }

    void DFSTraverse(MGragh *G,int k)//深度优先遍历
    {
     int i;
     for(i = 0; i<G->n;i++)
      visited[i] = 0;
     DFS(G,k);
     for(i = 0; i<G->n; i++)
     {
      if(!visited[i])
       DFS(G,i);
     }
    }

    void DFS(MGragh *G, int i)
    {
     cout << "visit vertex: "<<G->vexs[i]<<endl;
     visited[i] = 1;
     for(int j = 0;j<G->n; j++)
     {
      if(G->edge[i][j]&&!visited[j])
       DFS(G,j);
     }
    }

    void BFS(MGragh *G, int k)
    {
     int i,j,t;
     LinkQueue Q;
     InitQueue(&Q);
     for(t = 0; t < G->n; t++)
      visited[t] = 0;
     printf("visit vertex: %c ",G->vexs[k]);
     visited[k] = 1;
     EnQueue(&Q,k);
     while(!QueueEmpty(&Q))
     {
      i = DeQueue(&Q);
      for(j = 0; j<G->n;j++)
       if(G->edge[i][j]&&!visited[j])
       {
        printf("visit vertex: %c ", G->vexs[j]);
        visited[j] = 1;
        EnQueue(&Q, j);
       }
     }

    }

    void main()
    {
     MGragh *G = NULL,*P=NULL;
     int i;
     P = CreateMGraph(&G);
     DisMGraph(P);
     printf("请输入要遍历的顶点编号:");
     scanf("%d",&i);
     printf("深度优先遍历顺序是: ");
     DFSTraverse(P,i);
     printf("广度优先遍历顺序是: ");
     BFS(P,i);
    }

  • 相关阅读:
    在Ubuntu下编译FFmpeg
    AirSim
    上海高分无人机大赛
    飞机维修流程
    心灵感应灯三 服务器端
    Kmeans基本思想
    小觅双目相机测试
    ORB SLAM2在Ubuntu 16.04上的运行配置
    Moleskine智能笔+专用本:写完随时传到手机
    机器学习培训
  • 原文地址:https://www.cnblogs.com/helloaworld/p/5016180.html
Copyright © 2020-2023  润新知