拓扑排序

poj http://poj.org/problem?id=2367

 1 #include<cstdio>
 2 class Toposort { ///拓扑排序(矩阵)O(MV^2)
 3     static const int MV=1e2+10;///点的个数
 4     bool mat[MV][MV];
 5     int n,ret[MV],d[MV],i,j,k;
 6 public:
 7     void init(int tn) {///传入点数,点下标0开始
 8         n=tn;
 9         for(i=0; i<n; i++)
10             for(j=0; j<n; j++)
11                 mat[i][j]=false;
12     }
13     void add(int u,int v) {
14         mat[u][v]=true;
15     }
16     bool solve() {///如果无法完成排序,返回flase,否则返回true,ret返回有序点列
17         for (i=0; i<n; i++)
18             for (d[i]=j=0; j<n; d[i]+=mat[j++][i]);
19         for (k=0; k<n; ret[k++]=i) {
20             for (i=0; d[i]&&i<n; i++);
21             if (i==n) return false;
22             for (d[i]=-1,j=0; j<n; j++)
23                 d[j]-=mat[i][j];
24         }
25         return true;
26     }
27     int getvalue(int id) {///0~n-1中存着字典序最小的序列
28         return ret[id];
29     }
30 } g;
31 int main() {
32     int n,m,u,v;
33     while(~scanf("%d",&n)) {
34         g.init(n);
35         for(int i=0;i<n;i++){
36             while(true){
37                 scanf("%d",&u);
38                 if(!u) break;
39                 g.add(i,u-1);
40             }
41         }
42         g.solve();
43         for(int i=0;i<n;i++){
44             printf("%d%c",g.getvalue(i)+1,i==n-1?'
':' ');
45         }
46     }
47     return 0;
48 }
View Code

hdu http://acm.hdu.edu.cn/showproblem.php?pid=1285

 1 #include<cstdio>
 2 class Toposort { ///拓扑排序(矩阵)O(MV^2)
 3     static const int MV=5e2+10;///点的个数
 4     bool mat[MV][MV];
 5     int n,ret[MV],d[MV],i,j,k;
 6 public:
 7     void init(int tn) {///传入点数,点下标0开始
 8         n=tn;
 9         for(i=0; i<n; i++)
10             for(j=0; j<n; j++)
11                 mat[i][j]=false;
12     }
13     void add(int u,int v) {
14         mat[u][v]=true;
15     }
16     bool solve() {///如果无法完成排序,返回flase,否则返回true,ret返回有序点列
17         for (i=0; i<n; i++)
18             for (d[i]=j=0; j<n; d[i]+=mat[j++][i]);
19         for (k=0; k<n; ret[k++]=i) {
20             for (i=0; d[i]&&i<n; i++);
21             if (i==n) return false;
22             for (d[i]=-1,j=0; j<n; j++)
23                 d[j]-=mat[i][j];
24         }
25         return true;
26     }
27     int getvalue(int id) {
28         return ret[id];
29     }
30 } g;
31 int main() {
32     int n,m,u,v;
33     while(~scanf("%d%d",&n,&m)) {
34         g.init(n);
35         while(m--){
36             scanf("%d%d",&u,&v);
37             g.add(u-1,v-1);
38         }
39         g.solve();
40         for(int i=0;i<n;i++){
41             printf("%d%c",g.getvalue(i)+1,i==n-1?'
':' ');
42         }
43     }
44     return 0;
45 }
View Code
原文地址:https://www.cnblogs.com/gaolzzxin/p/4476102.html