HDU2094+拓扑排序
题意是个大坑。。。只要,保证有且只有一个人的入度是0,就yes。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int maxn = 2005; 8 int ind[ maxn ]; 9 struct node{ 10 int u,next; 11 }edge[ maxn*2000 ]; 12 int cnt,head[ maxn ]; 13 map<string,int>mp; 14 int vis[ maxn ]; 15 void init(){ 16 mp.clear(); 17 memset( vis,0,sizeof( vis ) ); 18 memset( ind,0,sizeof( ind ) ); 19 memset( head,-1,sizeof( head ) ); 20 cnt = 0; 21 } 22 void addedge( int a,int b ){ 23 edge[ cnt ].u = b; 24 edge[ cnt ].next = head[ a ]; 25 head[ a ] = cnt++; 26 } 27 28 void tuopu( int n ){ 29 //printf("tuopu\n"); 30 int sum = 0; 31 for( int i=1;i<=n;i++ ){ 32 int s = -1; 33 for( int j=1;j<=n;j++ ){ 34 if( ind[j]==0 ){ 35 s = j; 36 sum++; 37 ind[ j ] = -1; 38 break; 39 } 40 if( ind[ j ]<0 ){ 41 sum = -1; 42 break; 43 } 44 } 45 if( s==-1||sum==-1 ) break; 46 for( int j=head[ s ];j!=-1;j=edge[ j ].next ){ 47 ind[ edge[ j ].u ]--; 48 if( ind[ edge[ j ].u ]<0 ){ 49 sum = -1; 50 break; 51 } 52 } 53 if( sum==-1 ) break; 54 } 55 if( sum<n||sum>n ) printf("No\n"); 56 else printf("Yes\n"); 57 } 58 59 int main(){ 60 int n; 61 while( scanf("%d",&n)==1,n ){ 62 init(); 63 int cc = 1; 64 int num1,num2; 65 string a,b; 66 while( n-- ){ 67 cin>>a>>b; 68 if( mp[a]==0 ){ 69 mp[a]=cc; 70 num1 = cc++; 71 } 72 else num1 = mp[a]; 73 if( mp[b]==0 ){ 74 mp[b]=cc; 75 num2 = cc++; 76 } 77 else num2 = mp[b]; 78 ind[ num2 ]++; 79 addedge( num1,num2 ); 80 } 81 int sum = 0; 82 //int k; 83 for( int i=1;i<cc;i++ ){ 84 if( ind[i]==0 ){ 85 sum++; 86 //k = i; 87 if( sum>=2 ) 88 break; 89 } 90 } 91 if( sum>=2 ){ 92 printf("No\n"); 93 continue; 94 } 95 if( sum==1 ){ 96 printf("Yes\n"); 97 continue; 98 } 99 tuopu( cc-1 ); 100 } 101 return 0; 102 }
keep moving...