题意:给出n个字母的一些大小关系,判断能否拓扑排序或者出现了矛盾,如果是这两种情况要求出到第几组关系时就可以得到。否 则就是所给数据不完全。
思路:每读一组关系进行一次拓扑排序,如果排序成功或者出现矛盾记录第几组关系之后就不拓扑排序了,直接读完数据就行了。
#include<stdio.h> #include<string.h> #include<stack> const int N=30; using namespace std; int map[N][N],insep[N],num,p[N],indep[N],cp[N],n,k; int tuopusort() { int dep[N],i,u,pp=0; k=0; memcpy(dep,indep,sizeof(indep)); stack<int>Q; for(i=1;i<=n;i++) if(dep[i]==0)Q.push(i); while(!Q.empty()) { if(Q.size()>1)pp=-1; u=Q.top(); Q.pop(); p[k++]=u; for(i=1;i<=n;i++) { if(map[u][i]==1) if(--dep[i]==0) Q.push(i); } } if(k!=n) return 0;//有环 else if(pp==-1)return -1;//排序不唯一 else return 1;//排序唯一 } int main() { int m,i,x,y,sum,flag,j; char str[10]; while(scanf("%d%d",&n,&m)!=-1&&n+m) { flag=-1;j=-1;sum=0; memset(map,0,sizeof(map)); memset(indep,0,sizeof(indep)); memset(cp,0,sizeof(cp)); for(i=1;i<=m;i++) { scanf("%s",str); x=str[0]-'A'+1; y=str[2]-'A'+1; map[x][y]=1; indep[y]++; if(flag==-1) { flag=tuopusort(); j=i; } } if(flag==-1){printf("Sorted sequence cannot be determined.\n");continue;} else if(flag==1) { printf("Sorted sequence determined after %d relations: ",j); for(i=0;i<k;i++) printf("%c",'A'+(p[i]-1)); printf(".\n"); } else printf("Inconsistency found after %d relations.\n",j); } return 0; }