用邻接矩阵实现的深度优先遍历和广度优先遍历

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了用邻接矩阵实现的深度优先遍历和广度优先遍历相关的知识,希望对你有一定的参考价值。

  1 #include <stdio.h>
  2 #include <stdlib.h>
  3 #include <queue>
  4 #include <algorithm>
  5 using namespace std;
  6 
  7 #define ERROR -1
  8 #define MAXVEX 100      
  9 
 10 typedef int VertexType;
 11 typedef int VRType;
 12 typedef int EdgeType;
 13 bool visited[MAXVEX];    //访问标志数组
 14 
 15 typedef struct ArcCell
 16 {
 17     VRType adj;
 18 }ArcCell, AdjMatrix[MAXVEX][MAXVEX];
 19 
 20 typedef struct
 21 {
 22     VertexType vexs[MAXVEX];    //顶点向量
 23     AdjMatrix arcs;    //邻接矩阵
 24     int vexnum;        //顶点数
 25     int arcnum;        //边数
 26 }MGraph;
 27 
 28 /********* 按照顶点的信息找下表 ********/
 29 int LocateVex(MGraph G, int v){
 30     int i;
 31     for (i = 0; i < G.vexnum; ++i){
 32         if (G.vexs[i] == v)        //找到相匹配的
 33             break;
 34     }
 35     if (i<G.vexnum)        //如果存在就返回该下标
 36         return i;
 37     else
 38         return ERROR;    //否则返回错误
 39 }
 40 
 41 /********* 进行深搜 *********/
 42 void DFS(MGraph G, int i)
 43 {
 44     int j;
 45     visited[i] = true;    //标记为访问过
 46     printf("%d ", G.vexs[i]);    //打印出该顶点的名字
 47     for (j = 0; j<G.vexnum; j++)
 48     if (G.arcs[i][j].adj == 1 && !visited[j])
 49         DFS(G, j);
 50 }
 51 
 52 /********* 开始对图进行遍历 *********/
 53 void DFSTraverse(MGraph G)
 54 {
 55     int i;
 56     for (i = 0; i<G.vexnum; i++)
 57         visited[i] = false;
 58     for (i = 0; i<G.vexnum; i++)
 59     if (!visited[i])
 60         DFS(G, i);
 61 }
 62 
 63 /********* 建图 *********/
 64 void SetGraph(MGraph &G){
 65     printf("请输入图的顶点数目: ");
 66     scanf("%d", &G.vexnum);
 67     for (int i = 0; i<G.vexnum; ++i)
 68     {
 69         printf("请输入第%d个顶点信息:", i + 1);
 70         scanf("%d", &G.vexs[i]);
 71     }
 72     printf("请输入图的边的数目: ");
 73     scanf("%d", &G.arcnum);
 74     //将矩阵进行初始化
 75     for (int i = 0; i < G.vexnum; i++){
 76         for (int j = 0; j < G.vexnum; j++){
 77             G.arcs[i][j].adj = 0;
 78         }
 79     }
 80     printf("输入格式为“顶点a 顶点b”\n");
 81     for (int k = 0; k < G.arcnum; ++k)
 82     {
 83         int v1, v2, m, n;
 84         printf("请输入第 %d 条边的起始点和终端点: ", k + 1);
 85         scanf("%d%d", &v1, &v2);
 86         m = LocateVex(G, v1);    //找出所对应的下标
 87         n = LocateVex(G, v2);
 88         if (m >= 0 && n >= 0)    //满足情况的话
 89         {
 90             G.arcs[m][n].adj = 1;    //n--m 之间存在边
 91             G.arcs[n][m].adj = 1;
 92         }
 93         else
 94             printf("输入错误!\n");
 95     }
 96 }
 97 
 98 /******** 广搜 ********/
 99 void BFS(MGraph G, int i){
100     queue<int>q;
101     while (!q.empty()){
102         q.pop();
103     }
104     q.push(i);
105     while (!q.empty()){
106         int u = q.front();
107         q.pop();
108         if (visited[u])
109             continue;
110         printf("%d ", G.vexs[u]);
111         visited[u] = true;
112         for (int j = 0; j < G.vexnum; j++){
113             if (G.arcs[i][j].adj == 1 && !visited[j])
114                 q.push(j);
115         }
116     }
117 }
118 
119 /******** 进行广搜 *******/
120 void BFSTraverse(MGraph G){
121     for (int i = 0; i < G.vexnum; i++){
122         visited[i] = false;
123     }
124     for (int i = 0; i<G.vexnum; i++)
125     if (!visited[i])
126         BFS(G, i);
127 }
128 
129 int main()
130 {
131     MGraph G;
132     SetGraph(G);
133     DFSTraverse(G);
134     printf("\n\n\n\n");
135     BFSTraverse(G);
136     printf("\n");
137     return 0;
138 }

 

以上是关于用邻接矩阵实现的深度优先遍历和广度优先遍历的主要内容,如果未能解决你的问题,请参考以下文章

图的遍历:深度优先遍历,广度优先遍历

图的深度优先遍历DFS和广度优先遍历BFS(邻接矩阵存储)超详细完整代码进阶版

用c语言编程 1创建图的邻接矩阵和邻接表 2验证图的深度优先、广度优先遍历算法 3验证最短路径

数据结构—无向图创建邻接矩阵深度优先遍历和广度优先遍历(C语言版)

小朋友学数据结构(16):基于邻接矩阵的的深度优先遍历和广度优先遍历

c语言图的遍历,邻接表存储,深度,广度优先遍历