实现图的基本操作
要求:建立图(邻接矩阵、邻近表任选其一)的存储结构、实现图的深度优先遍历和广度优先遍历。
话不多说,代码贴上:
1 #include <stdio.h> 2 3 #include<iostream> 4 5 using namespace std; 6 7 #define MAX_Point 26 // 最大顶点数 8 9 int visited[MAX_Point]; // 遍历标志数组 10 11 struct Graph 12 13 { 14 15 char vexs[MAX_Point]; // 顶点表 16 17 int arc[MAX_Point][MAX_Point]; // 邻接矩阵 18 19 int numVertexs, numEdges; // 图中当前的顶点数和边数 }; 20 21 void CreateGraph(Graph *graph) 22 23 { 24 25 int i, j,k,io; 26 27 //printf("输入顶点数:"); 28 29 scanf("%d", &(graph->numVertexs)); // 接收输入的顶点数和边数, 30 31 // printf("输入顶点信息:"); 32 33 for(i = 0; i < graph->numVertexs; i++) // 读入顶点信息,建立顶点表 34 35 { 36 37 getchar(); // 清空键盘输入缓冲区 38 39 scanf("%c", &(graph->vexs[i])); 40 41 } 42 43 for(i = 0; i < graph->numVertexs; i++) 44 45 { 46 47 for(j = 0; j < graph->numVertexs; j++) 48 49 { 50 51 graph->arc[i][j] = 0; // 邻接矩阵初始化 52 53 } 54 55 } 56 57 // printf("输入边数:"); 58 59 scanf("%d", &(graph->numEdges)); 60 61 //printf("输入边上的顶点,分别用空格分隔:"); 62 63 for(k = 0; k < graph->numEdges; k++) // 读入numEdges条边,建立邻接矩阵 64 65 { 66 67 getchar(); // 清空键盘输入缓冲区 68 69 scanf("%d %d %d", &i, &j,&io); 70 71 graph->arc[i][j] = io; 72 73 graph->arc[j][i] = graph->arc[i][j]; // 因为是无向图,矩阵对称 74 75 } 76 77 } 78 79 void DFS(Graph graph, int i) 80 81 { 82 83 int j; 84 85 visited[i] = 1; // 标志已经被遍历过了 86 87 printf("%c ", graph.vexs[i]); 88 89 for(j = 0; j < graph.numVertexs; j++) 90 91 { // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用 92 93 if(graph.arc[i][j]!=0 && !visited[j]) 94 95 { 96 97 DFS(graph, j); 98 99 } 100 101 } 102 103 } 104 105 void DFSTraverse(Graph graph) 106 107 { 108 109 cout<<"DFS:"; 110 111 int i; 112 113 for(i = 0; i < graph.numVertexs; i++) 114 115 { // 初始所有顶点都是未被遍历过的状态 116 117 visited[i] = 0; 118 119 } 120 121 for(i = 0; i < graph.numVertexs; i++) 122 123 { // 对未访问过的顶点调用DFS,若是连通图,只会执行一次 124 125 if(!visited[i]) 126 127 { 128 129 DFS(graph, i); 130 131 } 132 133 } 134 135 cout<<endl; } 136 137 //广度遍历 138 139 void BFS(Graph graph, int i) 140 141 { 142 143 int j; 144 145 visited[i] = 1; // 标志已经被遍历过了 146 147 printf("%c ", graph.vexs[i]); 148 149 for(j = 0; j < graph.numVertexs; j++) 150 151 { // 如果与第i个顶点相邻接且该顶点还没有被遍历过,则对邻接顶点递归调用 152 153 if(graph.arc[i][j] !=0 && !visited[j]) 154 155 { //BFS(graph, j); 156 157 visited[j] = 1; // 标志已经被遍历过了 158 159 printf("%c ", graph.vexs[j]); 160 161 } 162 163 } 164 165 } 166 167 void BFSTraverse(Graph graph) 168 169 { 170 171 cout<<"BFS:"; 172 173 int i; 174 175 for(i = 0; i < graph.numVertexs; i++) 176 177 { // 初始所有顶点都是未被遍历过的状态 178 179 visited[i] = 0; 180 181 } 182 183 for(i = 0; i < graph.numVertexs; i++) 184 185 { // 对未访问过的顶点调用BFS,若是连通图,只会执行一次 186 187 if(!visited[i]) 188 189 { 190 191 BFS(graph, i); 192 193 } 194 195 } 196 197 cout<<endl; 198 199 } 200 201 char change(int i) 202 203 { 204 205 char chng; 206 207 switch(i) 208 209 { 210 211 case 0: chng='a'; break; 212 213 case 1: chng='b'; break; 214 215 case 2: chng='c'; break; 216 217 case 3: chng='d'; break; 218 219 case 4: chng='e'; break; 220 221 case 5: chng='f'; break; 222 223 case 6: chng='g'; break; 224 225 case 7: chng='h'; break; 226 227 case 8: chng='i'; break; 228 229 case 9: chng='j'; break; 230 231 } 232 233 return chng; 234 235 } 236 237 void show(Graph graph) { 238 239 cout<<"edges are:"<<endl; 240 241 for(int i = 0; i < graph.numVertexs; i++) 242 243 { 244 245 for(int j = i+1; j < graph.numVertexs; j++) 246 247 { 248 249 if(graph.arc[i][j]!=0) 250 251 { 252 253 cout<<change(i)<<"-"<<change(j)<<":"<<graph.arc[i][j]<<endl; 254 255 } 256 257 } 258 259 } 260 261 } 262 263 264 265 int main() 266 267 { 268 269 Graph graph; 270 271 CreateGraph(&graph); 272 273 DFSTraverse(graph); 274 275 BFSTraverse(graph); 276 277 show(graph); 278 279 return 0; 280 281 }