zrq495
www.zrq495.com

拓扑排序。

  (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 }
posted on 2012-08-02 18:23  zrq495  阅读(455)  评论(0编辑  收藏  举报