有环无向图应用--拓扑排序

孤者浪人 提交于 2020-01-16 13:27:10

转自大神:思路超清晰:https://blog.csdn.net/qq_37618797/article/details/81070577

前言看大神的吧 复制没图片

代码:

 1 #include <iostream>
 2 
 3 using namespace std;
 4 #define N 13
 5 int main()
 6 {
 7     int map[N][N]; //邻接矩阵
 8     // 初始化矩阵的值全部为0表示各个顶点间没有边连接
 9     for(int i = 0; i <= N-1; i++){
10         for(int j = 0; j <= N-1; j++){
11             map[i][j] = 0;
12         }
13     }
14 
15     int a,b;  //定义两个变量,用来输入
16     int v,l;  //顶点数和边数
17 
18     cout << "请输入顶点数:";
19     cin >> v;
20     cout << "请输入边数:";
21     cin >> l;
22     cout << "请输入边:" << endl;
23 
24     for(int i = 1; i <= l; i++){
25             cin >> a >> b;
26             map[a][b] = 1; // 表示顶点a指向顶点b的边
27     }
28     cout << "邻接矩阵如下所示\n" << endl;
29     for(int i = 1; i <= N-1; i++){
30         for(int j = 1; j <= N-1; j++){
31             cout << map[i][j];
32         }
33         cout << endl;
34     }
35 
36     int k; //用于计算度数
37     int ID[N]; //用于存放入度
38     for(int i = 1; i <= v; i++){  // 计算入度
39         k = 0;
40         for(int j = 1; j <= v; j++){
41             if(map[j][i] == 1) //如果顶点j到顶点i有边,则顶点i的入度+1
42                 k++;
43         }
44         ID[i] = k;
45     }
46     //1、在有向图中选一个没有前驱的顶点并且输出
47     cout << "\n\n拓扑序列: ";
48     int count = 0;   //最后用来判断是否所有的顶点输出
49     while(1){
50         for(int i = 1; i <= v; i++){
51             if(ID[i] == 0){
52                 cout << i << " ";  //输出顶点
53                 count++;
54                 //2、从图中删除该顶点和所有以它为尾的弧,即删除所有与它有关的边。
55                 ID[i] = -1; //将此顶点入度设为-1,表示删除
56                 for(int j = 1; j <= v; j++){
57                     if(map[i][j] == 1){     //如果顶点j与顶点i有边,则删除这条边,并且顶点j的入度-1
58                         ID[j]--;
59                     }
60                 }
61             }
62         }
63         //3、重复上述两步,直至全部顶点均已输出;或者当图中不存在无前驱的顶点为止。
64         if(count == v){
65             break;  //若count == 顶点数,表示所有顶点的入度都为-1,即所有的边均已输出,停止操作。
66         }
67     }
68     return 0;
69 }

最终得拓扑序列:C1--C2--C3--C4--C5--C7--C9--C10--C11--C6--C12--C8。

注意:拓扑序列并不唯一,C9--C10--C11--C6--C1--C12--C4--C2--C3--C5--C7--C8 也是一种拓扑序列。

 

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