第一单:
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 const int maxn=105; 5 int map[maxn][maxn]; 6 int indegree[maxn]; 7 int n,m; 8 int main() 9 { 10 int x,y; 11 while(scanf("%d%d",&n,&m)!=EOF&&n+m!=0) 12 { 13 memset(map,0,sizeof(map)); 14 memset(indegree,0,sizeof(indegree)); 15 while(m--) 16 { 17 scanf("%d%d",&x,&y); 18 x++; 19 y++; 20 if(!map[x][y]) 21 { 22 map[x][y]=1; 23 indegree[y]++; 24 } 25 } 26 int j; 27 bool flag=1; 28 for(int i=1;i<=n;i++) 29 { 30 for(j=1;j<=n;j++) 31 { 32 if(indegree[j]==0) 33 { 34 indegree[j]--; 35 for(int k=1;k<=n;k++) 36 { 37 if(map[j][k]) 38 indegree[k]--; 39 } 40 break ; 41 } 42 } 43 if(j>n){ 44 flag=0; 45 break; 46 } 47 } 48 printf(flag==0?"NO\n":"YES\n"); 49 } 50 return 0; 51 }
1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define maxn 505 5 bool map[maxn][maxn]; 6 int indegree[maxn],tp[maxn],n,m; 7 void tuopu_sort() 8 { 9 memset(tp,0,sizeof(tp)); //拓扑排序数组清空 10 int i,j,k=0,ll; 11 for(i=1;i<=n;i++) 12 { 13 for(j=1;j<=n;j++) 14 { 15 /*每次取出入读位0的数*/ 16 if(indegree[j]==0) 17 { 18 indegree[j]=-1; //让他等于-1;表示舍弃掉这个数 19 tp[k++]=j; //放到拓扑序列中 20 /*进行一次循环,去掉所有这个数指向的数的一个度*/ 21 for(ll=1;ll<=n;ll++) 22 { 23 if(map[j][ll]) //j-->LL 表示成为map[j][ll] 24 { 25 indegree[ll]--; //减少一个 26 } 27 } 28 break; // 终止,然后进行下次的查找 29 } 30 } 31 if(j>n) 32 { 33 //这表示构成了一个环 34 return ; //之间结束即可,但是在其他的题中,不能这样... 35 } 36 } 37 } 38 int main() 39 { 40 int i=0,fx,ty;// fx--->from x to y 41 while(scanf("%d%d",&n,&m)!=EOF) 42 { 43 memset(map,0,sizeof(map)); 44 memset(indegree,0,sizeof(indegree)); 45 for(i=0;i<m;i++) 46 { 47 scanf("%d%d",&fx,&ty); 48 if(!map[fx][ty]) //防止数据重复 49 { 50 map[fx][ty]=true; 51 indegree[ty]++; //入度加一 52 } 53 } 54 tuopu_sort(); 55 for(i=0;i<n-1;i++) 56 { 57 printf("%d ",tp[i]); 58 } 59 printf("%d\n",tp[i]); 60 } 61 return 0; 62 }
1 /*@coder 龚细军*/ 2 #include<cstdio> 3 #include<cstring> 4 #include<cstdlib> 5 #include<queue> 6 #include<vector> //动态的二维数组 7 #include<iostream> 8 using namespace std; 9 const int maxn=10002; 10 int n,m; 11 int cnt[maxn],outd[maxn]; 12 vector< vector<int> >map(maxn); 13 void tp_sort(int tol) 14 { 15 int i; 16 queue<int>st; 17 for(i=1;i<=n;i++) 18 { 19 if(!outd[i]) 20 { 21 outd[i]--; 22 st.push(i); 23 break; 24 } 25 } 26 //环如何消除 27 while(!st.empty()) 28 { 29 int temp=st.front(); 30 vector<int>::iterator it; 31 for(it=map[temp].begin();it!=map[temp].end();it++) 32 { 33 outd[*it]--; 34 if(cnt[*it]<=cnt[temp]) 35 cnt[*it]=cnt[temp]+1; 36 } 37 st.pop(); 38 for(i=1;i<=n;i++) 39 { 40 if(!outd[i]) 41 { 42 outd[i]--; 43 st.push(i); 44 break; 45 } 46 } 47 } 48 for(i=1;i<=n;i++) 49 { 50 if(outd[i]!=-1) 51 { 52 puts("-1"); 53 return ; 54 } 55 } 56 int ans=0; 57 for(i=1;i<=n;i++) 58 { 59 ans+=cnt[i]; 60 } 61 if(ans) 62 printf("%d\n",n*888+ans); 63 else 64 puts("-1"); 65 } 66 int main() 67 { 68 int a,b,i; 69 while(scanf("%d%d",&n,&m)!=EOF) 70 { 71 for(i=1;i<=n;i++) map[i].clear(); 72 memset(outd,0,sizeof(outd)); 73 memset(cnt,0,sizeof(cnt)); 74 i=1; 75 while(m--) 76 { 77 scanf("%d%d",&a,&b); 78 map[b].push_back(a); 79 outd[a]++; /*out++*/ 80 } 81 tp_sort(i); 82 } 83 return 0; 84 }
暑假集训之专题----拓扑排序题解,布布扣,bubuko.com
原文:http://www.cnblogs.com/gongxijun/p/3852305.html