基于邻接矩阵的拓扑排序

删除回忆录丶 提交于 2020-01-25 19:48:26

总结下算法好了:

(1)构图:每个活动是一个顶点,如果A必须排在B前面,那么有边从顶点A指向顶点B,顶点B的入度+1

(2)遍历所有顶点,将入度为0的顶点入栈

(3)如果栈不为空,则将栈顶出栈,然后将该顶点从图中删掉,即该点指向的点的入度-1,如果减后为0则入栈,重复(3)

 

简单版的代码,只能举出一种拓扑排序:

 1 #include <stdio.h>
 2 #include <string.h>
 3 
 4 #define MAX_VERTEX_NUM 100
 5 
 6 int ver_num;
 7 char vertex[MAX_VERTEX_NUM];
 8 int indeg[MAX_VERTEX_NUM];
 9 int graph[MAX_VERTEX_NUM][MAX_VERTEX_NUM];
10 
11 void CreateMGragh()
12 {
13     int i,j;
14     int n1,n2,f1,f2;
15     char ch1,ch2,ch3;
16     while(1){
17         scanf("%c%c%c",&ch1,&ch2,&ch3);
18         f1 = f2 = 0;
19         for (i=0; vertex[i] != 0; i++){
20             if (vertex[i] == ch1){
21                 f1 = 1;
22                 n1 = i;
23                 break;
24             }
25         }
26         if (f1 == 0){
27             vertex[i] = ch1;
28             n1 = i;
29         }
30         for (j=0; vertex[j] != 0; j++){
31             if (vertex[j] == ch2){
32                 f2 = 1;
33                 n2 = j;
34                 break;
35             }
36         }
37         if (f2 == 0){
38             vertex[j] = ch2;
39             n2 = j;
40         }
41 
42         graph[n1][n2] = 1;
43         indeg[n2]++;
44 
45 
46         if (ch3 == '\n'){
47             break;
48         }
49     }
50     for (i=0; vertex[i] != 0; i++);
51     ver_num = i;
52 }
53 
54 void topsort()
55 {
56     int stack[MAX_VERTEX_NUM];
57     int i,top;
58 
59     top = 0;
60     memset(stack,0,sizeof(stack));
61     
62     // 入度为0的点都入栈
63     for (i=0; i<ver_num; i++){
64         if (indeg[i] == 0){
65             stack[top++] = i;
66         }
67     }
68 
69     while(0 != top){
70         // 出栈
71         printf("%c",vertex[stack[--top]]);
72         
73         // 把这个点删掉 即它后面的点的入度-1 并把连线去掉
74         for (i=0; i<ver_num; i++){
75             if (graph[stack[top]][i] == 1){
76                 graph[stack[top]][i] = 0;
77                 indeg[i]--;
78                 if (indeg[i] == 0){
79                     stack[top++] = i;
80                 }
81             }
82         }
83     }
84     printf("\n");
85 }
86 
87 int main()
88 {
89     CreateMGragh();
90     topsort();
91     return 0;
92 }

测试用例及结果:

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!