拓扑排序。
(1)从有向图中选择一个没有前驱(即入度为0)的顶点并且输出它.
(2)从网中删去该顶点,并且删去从该顶点发出的全部有向边.
(3)重复上述两步,直到剩余的网中不再存在没有前趋的顶点为止.
代码如下:
1 #include<iostream> 2 #include<cstring> 3 4 using namespace std; 5 6 int main() 7 { 8 int i, j, k, n, m, a, b; 9 int dgr[501], map[501][501]; //dgr[]存放节点的入度 10 while(cin >> n >> m) 11 { 12 memset(dgr, 0, sizeof(dgr)); 13 memset(map, 0, sizeof(map)); 14 for (i=1; i<=m; i++) 15 { 16 cin >> a >> b; 17 if (map[a][b] == 0) //重复 不计 18 { 19 map[a][b]=1; 20 dgr[b]++; 21 } 22 } 23 for (i=1; i<=n; i++) //n次查找 24 for (j=1; j<=n; j++) 25 if (dgr[j] == 0) //寻找入度为0的结点,并将其删除 26 { 27 dgr[j]=-1; 28 cout << j; 29 if (i == n) cout << endl; 30 else cout << " "; 31 for (k=1; k<=n; k++) //更新以它为前驱结点的入度 32 if (map[j][k] == 1) 33 dgr[k]--; 34 break; 35 } 36 } 37 return 0; 38 }