拓扑排序
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?'\n':' '); 45 } 46 } 47 return 0; 48 }
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?'\n':' '); 42 } 43 } 44 return 0; 45 }