1 /** 2 知识点:(有向图) 3 强连通图的邻接矩阵存储图; 4 强连通图的深度优先遍历(递归方式实现) 5 */ 6 #include <stdio.h> 7 #include <string.h> 8 #define N 5 9 #define ARC 10 10 int visit[ARC]; 11 typedef struct { 12 char vex[ARC][N];///顶点 13 int arc[ARC][ARC]; 14 int numv,nume;///顶点,边的个数 15 }Graph; 16 int getIndex(Graph& G,char s[]){ 17 for(int i = 0; i < G.numv; i++){ 18 if(strcmp(s,G.vex[i]) == 0) 19 return i; 20 } 21 return -1; 22 } 23 void create(Graph& G){ 24 printf("请分别输入顶点和边的个数:\n"); 25 scanf("%d%d",&G.numv,&G.nume); 26 printf("输入图的顶点信息:\n"); 27 for(int i = 0; i < G.numv; i++) 28 scanf("%s",G.vex[i]); 29 printf("请输入边的信息:\n"); 30 ///初始化数组G.arc 31 for(int i = 0; i < G.nume; i++) 32 for(int j = 0; j < G.nume; j++) 33 G.arc[i][j] = 0; 34 char s[N],e[N]; 35 int i = 0,u,v; 36 while(i < G.nume){ 37 scanf("%s%s",s,e); 38 u = getIndex(G,s); 39 v = getIndex(G,e); 40 ///假设输入的起始和终止顶点都存在 41 G.arc[u][v] = 1; 42 i++; 43 } 44 } 45 ///输出矩阵 46 void output(Graph G){ 47 printf(" "); 48 for(int i = 0; i < G.numv; i++) 49 printf("%4s",G.vex[i]); 50 printf("\n"); 51 for(int i = 0; i < G.numv; i++){ 52 for(int j = -1; j < G.numv; j++){ 53 if(j == -1) 54 printf("%4s",G.vex[i]); 55 else{ 56 printf("%4d",G.arc[i][j]); 57 } 58 } 59 printf("\n"); 60 } 61 } 62 63 ///查找图G中位序为s的第一个邻接点 64 int firstVex(Graph G,int s){ 65 for(int i = 0; i < G.numv; i++){ 66 if(G.arc[s][i] == 1) 67 return i; 68 } 69 return -1; 70 } 71 ///返回顶点s的(相对于w的)下一个邻接顶点 72 ///若w是s的最后一个邻接顶点,则返回空 73 int nextVex(Graph G,int s,int w){ 74 for(int i = w+1; i < G.numv; i++){ 75 if(G.arc[s][i] == 1) 76 return i; 77 } 78 return -1; 79 } 80 ///递归法 深度优先遍历 81 void dfs(Graph G,int s){///从位置为s的顶点开始遍历 82 for(int w=firstVex(G,s);w!=-1;w=nextVex(G,s,w)){ 83 if(!visit[w]){ 84 printf("%4s",G.vex[w]); 85 visit[w] = 1; 86 dfs(G,w); 87 } 88 } 89 } 90 91 int main(void){ 92 Graph G; 93 create(G); 94 output(G); 95 printf("请输入遍历的起始顶点:\n"); 96 char s[N]; 97 scanf("%s",s); 98 for(int i = 0; i < G.numv; i++) 99 visit[i] = 0; 100 printf("%4s",s); visit[getIndex(G,s)] = 1; 101 dfs(G,getIndex(G,s)); 102 return 0; 103 }
测试数据:
8 9
v1 v2 v3 v4 v5 v6 v7 v8
v1 v2
v1 v3
v2 v4
v2 v5
v3 v6
v3 v7
v4 v8
v5 v8
v7 v6
v1
时间: 2024-11-15 21:05:47