http://poj.org/problem?id=1094
题意:给你m个字母,有n个判断语句。求在哪个语句就可以判断出这个是不是一个环,或者在哪个语句可以判断出这些字母的排序规则,或者就是不能确定。
思路:每输入一次,进行一次排序,看会不会构成环或者已经可以确定了判断规则。
1 #include <stdio.h> 2 #include <string.h> 3 4 char ans[30]; 5 6 int indegree[27]; 7 8 bool mp[26][26]; 9 10 int topsort(int n) 11 { 12 int i,j,m,flag,c=0,tmp[27],l=1; 13 for(i=0;i<n;i++) 14 tmp[i]=indegree[i]; 15 for(i=0;i<n;i++) 16 { 17 m=0; 18 for(j=0;j<n;j++) 19 if(tmp[j]==0) {m++;flag=j;} 20 if(m==0) return 0; //如果全部的度都是0的话,那么说明有环。 21 ans[c++]=flag+'A'; 22 if(m>1) l=-1; //这个不能用return -1,因为成环不一定是要成一个大环,可以几个字母成一个小环。 23 tmp[flag]--; 24 for(j=0;j<n;j++) 25 if(mp[flag][j]) tmp[j]--; 26 } 27 return l; 28 } 29 30 int main() 31 { 32 freopen("in.txt","r",stdin); 33 int m,n,sign; 34 char inp[4]; 35 while(scanf("%d%d",&m,&n),m||n) 36 { 37 memset(mp,false,sizeof(mp)); 38 memset(indegree,0,sizeof(indegree)); 39 sign=0; 40 for(int i=1;i<=n;i++) 41 { 42 scanf("%s",inp); 43 if(sign) continue; 44 mp[inp[0]-'A'][inp[2]-'A']=true; 45 indegree[inp[2]-'A']++; 46 int s=topsort(m); 47 if(s==0) 48 { 49 printf("Inconsistency found after %d relations. ",i); 50 sign=1; 51 } 52 else if(s==1) 53 { 54 printf("Sorted sequence determined after %d relations: ",i); 55 for(int j=0;j<m;j++) 56 printf("%c",ans[j]); 57 printf(". "); 58 sign=1; 59 } 60 } 61 if(!sign) 62 printf("Sorted sequence cannot be determined. "); 63 } 64 return 0; 65 }