无向图遍历

 大神:https://www.jianshu.com/p/e58665864d54

DFS

依次输入无向图的顶点个数、边的总条数以及每一条边,如0 1则表示顶点A和顶点B之间有边,然后创建该图的邻接矩阵的存储结构。请补充算法,对该图进行深度优先遍历,输出其遍历结果。

输入:6   11
0 1  0 5  1 5  0 3  5 3  0 2  2 3  5 4  3 4  0 4  2 4
输出:ABFDCE 
 
  1 #include<iostream>
  2 using namespace std;
  3 #define UNVISITED 0
  4 #define VISITED 1
  5 
  6 class AdjMatrixUndirGraph
  7 {
  8 public:
  9     int vexNum, edgeNum;    // 顶点个数和边数
 10     int **Matrix;           // 邻接矩阵
 11     char *elems;            // 顶点数据
 12     bool *tag;
 13 
 14     AdjMatrixUndirGraph(char es[], int vertexNum);
 15     int FirstAdjVex(int v) ;          // 返回顶点v的第一个邻接点
 16     int NextAdjVex(int v1, int v2);   // 返回顶点v1的相对于v2的下一个邻接点
 17     void Display();                   // 图的输出
 18     void DFS(int v);                  // 深度遍历
 19 };
 20 
 21 AdjMatrixUndirGraph::AdjMatrixUndirGraph(char es[], int vertexNum)
 22 {
 23     vexNum = vertexNum;
 24     edgeNum = 0;
 25     elems = new char[vexNum];
 26     int u, v;
 27     for(v = 0; v < vexNum; v++)
 28     {  // 初始化标志数组
 29         elems[v] = es[v];
 30     }
 31 
 32     tag = new bool[vexNum];        // 生成标志数组
 33     for(v = 0; v < vexNum; v++)
 34     {  // 初始化标志数组
 35         tag[v] = UNVISITED;
 36     }
 37 
 38     Matrix = (int **)new int *[vexNum];// 生成邻接矩阵
 39     for (v = 0; v < vexNum; v++)
 40     {  // 生成邻接矩阵的行
 41         Matrix[v] = new int[vexNum];
 42     }
 43 
 44     for (u = 0; u < vexNum; u++)
 45     {
 46         for (v = 0; v < vexNum; v++)
 47         {  // 为邻接矩阵元素赋值
 48             Matrix[u][v] = 0;
 49         }
 50     }
 51 }
 52 
 53 int AdjMatrixUndirGraph::FirstAdjVex(int v)
 54 // 操作结果:返回顶点v的第1个邻接点
 55 {
 56     int k;
 57     for(k=0;k<vexNum;k++){
 58         if(Matrix[v][k]==1&&tag[k]==UNVISITED){
 59             return k;
 60         }
 61     }
 62     return -1;    // 返回-1表示无邻接点
 63 }
 64 
 65 int AdjMatrixUndirGraph::NextAdjVex(int v1, int v2)
 66 // 操作结果:返回顶点v1的相对于v2的下1个邻接点
 67 {
 68     int k;
 69     for(k=v2+1;k<vexNum;k++){
 70         if(Matrix[v1][k]==1&&tag[k]==UNVISITED){
 71             return k;
 72         }
 73     }
 74     return -1;    // 返回-1表示无邻接点
 75 }
 76 
 77 void AdjMatrixUndirGraph::Display()
 78 {
 79     int i,j;
 80      for(i=0;i<vexNum;i++){
 81         for(j=0;j<vexNum;j++){
 82             cout<<Matrix[i][j]<<" ";
 83         }
 84         cout<<endl;
 85      }
 86 }
 87 
 88 void AdjMatrixUndirGraph::DFS(int v)
 89 {        int w;//返回的是对应的数字 而不是顶点信息(ABCD啥的)
 90          cout<<elems[v];
 91          tag[v]=1;
 92          w=FirstAdjVex(v);//找到v的第一个临界点 找不到的话返回-1
 93          while(w!=-1){
 94             DFS(w);
 95             w=NextAdjVex(v,w);
 96          }
 97 
 98 }
 99 
100 int main()
101 {
102     char vexs[] = {'A', 'B', 'C', 'D','E','F','G','H','I','J','K','L',
103             'M','N','O','P','Q','R','S','T','U','V','W','X','Y','Z'};
104     int n,t,i,x,y;
105     cout<<"请输入无向图的顶点个数:";
106     cin>>n;
107     AdjMatrixUndirGraph g(vexs, n);//新建完毕
108 
109     cout<<"请输入边的总条数:";
110     cin>>t;
111     cout<<"请依次输入边,如0 1表示A和B之间有边:"<<endl;
112     for (i = 1; i <=t; i++)
113     {
114         cin>>x>>y;
115         g.Matrix[x][y]= g.Matrix[y][x]= 1;
116     }
117 
118     cout << endl <<"原无向连通图的邻接矩阵如下:" << endl;
119     g.Display();
120     cout << endl;
121 
122     cout << "深度遍历序列为:" << endl;
123     g.DFS(0);
124     cout<<endl;
125 
126     return 0;
127 }

 

BFS

有错误还没改不知道哪里出了问题

  1 #include<bits/stdc++.h>
  2 using namespace std;
  3 #define MAX_NUM 100
  4 typedef struct Graph{
  5      char vexnum,arcnum;//顶点数,边数
  6      char vertex[MAX_NUM];//顶点信息数组
  7      int arcs[MAX_NUM][MAX_NUM];//邻接数组
  8 }Graph;
  9 bool visited[MAX_NUM];
 10 typedef struct{
 11      int data[MAX_NUM];//顺序队列 这是队列的元素空间
 12      int front;//头指针指示器
 13      int rear;//尾指针  注意啊这是int类型的
 14 }Queue;
 15 void InitQueue(Queue *Q){ //初始化队列
 16 
 17     Q->front=Q->rear=0;
 18 }
 19 void EnterQueue(Queue *Q,int e){
 20     int x;
 21      /*
 22      if((Q->rear+1)%MAX_NUM==Q->front){
 23         return false;
 24      }*/
 25      Q->data[Q->rear]=x;
 26      Q->rear=(Q->rear+1)%MAX_NUM;
 27 
 28 }
 29 void DeleteQueue(Queue *Q,int *x){
 30 
 31      *x=Q->data[Q->front];
 32      Q->front=(Q->front+1)%MAX_NUM;
 33 
 34 }
 35 int Empty(Queue Q){
 36 
 37     if(Q.front==Q.rear){
 38         return 1;//队列为空 返回真
 39     }
 40     else{ return 0;}
 41 
 42 }
 43 void CreateGraph(Graph *g){
 44       int i,j;
 45       int u,v;//输入的边的信息
 46 
 47       cout<<"输入顶点数和边数"<<endl;
 48       cin>>g->vexnum>>g->arcnum;
 49       for(i=0;i<g->vexnum;i++){
 50          visited[i]=false;//初始化判断数组都为false 所有点都未访问
 51       }
 52       cout<<"输入顶点信息数组"<<endl;
 53       for(i=0;i<g->vexnum;i++){
 54          cin>>g->vertex[i];//可以输入ABCDE了
 55       }
 56     //对邻接矩阵的 初始化 和有联系的点的信息化
 57       for(i=0;i<g->vexnum;i++){
 58         for(j=0;j<g->vexnum;j++){
 59             g->arcs[i][j]=0;//初始化邻接矩阵啦
 60         }
 61       }
 62       for(j=0;j<g->arcnum;j++){
 63          cout<<"请依次输入边,如0 1 表示A和B之间有边"<<endl;
 64          cin>>u>>v;
 65          g->arcs[u][v]=1;
 66          g->arcs[v][u]=1;//这样就联系起来啦 输入有联系的边的信息了
 67       }
 68 }
 69 int FirstVertex(Graph g,int v){//int类型哦
 70 
 71        int k=0;
 72        for(k=0;k<g.vexnum;k++){
 73           if(g.arcs[v][k]==1&&visited[k]==false){
 74              return k;
 75           }
 76        }
 77        return -1;
 78 }
 79 int NextVertex(Graph g,int v1,int v2){
 80 
 81           int k;
 82           for(k=v2+1;k<g.vexnum;k++){
 83               if(g.arcs[v1][k]==1&&visited[k]==false){
 84                   return k;
 85                }
 86           }
 87           return -1;
 88 }
 89 void BreadthFirstSearch(Graph *g,int v0){ //bfs遍历
 90          Queue Q;
 91          int v,i;
 92          visited[v0]=true;
 93          cout<<g->vertex[v0]<<" ";
 94          InitQueue(&Q);//初始化队列
 95          EnterQueue(&Q,v0);//向队列中插入元素
 96          /*while(!Empty(Q)){//为空返回真 此条件是判断队列不为空
 97             DeleteQueue(&Q,&v);//队首元素v出队
 98             w=FirstVertex(g,v);
 99             while(w!=-1){
100                 if(!visited[w]){
101                     visited[w]=1;
102                     EnterQueue(&Q,W);
103                 }
104                 w=NextVertex(g,v,w);
105             }
106          }*/
107          while(!Empty(Q)){
108             DeleteQueue(&Q,&v);
109             for(i=0;i<g->vexnum;i++){
110                 if(g->arcs[v][i]==1&&visited[i]==false){
111                     visited[i]=true;
112                     cout<<g->vertex[i]<<" ";
113                     EnterQueue(&Q,i);
114                 }
115             }
116          }
117 }
118 //操作的是数字 输出的时候让数字对应vertex[]数组  vertex[0]=A
119 void ShowGraph(Graph *g){
120      cout<<"输出图的信息"<<endl;
121      int i,j;
122      for(i=0;i<g->vexnum;i++){
123         for(j=0;j<g->vexnum;j++){
124             cout<<g->arcs[i][j]<<" ";
125         }
126         cout<<endl;
127      }
128 }
129 
130 int main(){
131 
132      Graph *g;
133      int i;
134      g=(Graph*)malloc(sizeof(Graph));
135      CreateGraph(g);
136      for(i=0;i<g->vexnum;i++){
137         BreadthFirstSearch(g,i);
138         cout<<endl;
139      }
140      ShowGraph(g);
141 }

 

posted @ 2019-06-14 14:47  像走了一光年  阅读(823)  评论(0编辑  收藏  举报