用邻接矩阵实现的深度优先遍历和广度优先遍历
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语言版)