poj2367--Genealogical tree(拓扑排序)

根据题意构图,简单的拓扑排序,输出排序的结果

View Code
 1 //Accepted    4308K    47MS    G++
 2 #include "stdio.h"
 3 #include "string.h"
 4 #define M 1000
 5 int g[M][M];
 6 int q[M],p[M];
 7 bool useif[M];
 8 int top=0,n,m;
 9 void topo()
10 {
11     int i;
12     bool use = false;
13     top=0;
14     memset(useif,0,sizeof(useif));
15     for (i=1;i<=n;i++)
16     {
17         if(q[i] == 0)
18         {
19             useif[i] = true;
20             p[top++] = i;
21         }
22     }
23     while( top > 0)
24     {
25         int x = p[--top];
26         printf("%d ",x);
27         for(i=1;i<=n;i++)
28         {
29             if(!useif[i] && g[x][i]==1)
30             {
31                 q[i]--;
32                 if(q[i] == 0)
33                 {
34                     useif[i] = true;
35                     p[top++] = i;
36                 //    break;
37                 }
38                 
39             }
40         }
41     }
42 }
43 int main()
44 {
45     int i;
46     while(scanf("%d",&n)!=EOF)
47     {
48         memset(g,0,sizeof(g));
49         memset(q,0,sizeof(q));
50         memset(p,0,sizeof(p));
51         for(i=1;i<=n;i++)
52         {
53             while(scanf("%d",&m)==1 && m)
54             {
55                 g[i][m] = 1;
56                 q[m]++;
57             }    
58         }
59         topo();
60     }
61     return 0;
62 }
posted @ 2012-09-18 21:21  Wheat″  阅读(378)  评论(1)    收藏  举报