POJ-1094-Sorting It All Out
分析:这题需要考虑的方面比较多
需要考虑到环,唯一的拓扑序列,不唯一的拓扑序列,还需要输出在第几组数据之后知道有环或唯一的拓扑序列,并且输出唯一的拓扑序列
因此需要对每组数据的输入进行拓扑序列
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include <iostream> #include <cstdio> #include <cstring> #define MAXN 30 using namespace std; int n,m; int degree[MAXN],temp[MAXN]; int q[MAXN];int iq; struct eee{ int v,next; }edge[MAXN*MAXN]; int e,first[MAXN]; void add(int u,int v){ edge[e].v=v; edge[e].next=first[u]; first[u]=e++; } void init(){ memset(first,-1,sizeof(first)); memset(degree,0,sizeof(degree)); e=0; } //拓扑排序 int toposort(){ int mult=0; iq=0; for(int i=0;i<n;i++){ temp[i]=degree[i]; } for(int i=0;i<n;i++){ if(temp[i]==0){ q[iq++]=i; } } if(iq>1)mult=1; for(int i=0;i<iq;i++){ int u=q[i]; int k=0; for(int j=first[u];j!=-1;j=edge[j].next){ int v=edge[j].v; temp[v]--; if(temp[v]==0){ k++; q[iq++]=v; } } if(k>1)mult=1; } if(iq!=n)return 2; else if(mult)return 1; else return 3; } int main() { freopen("in.txt","r",stdin); while(~scanf("%d%d",&n,&m)){ if(n==0&&m==0)break; init(); char a[5]; int sure=0,no=0; for(int i=0;i<m;i++){ scanf("%s",a); degree[a[2]-'A']++; add(a[0]-'A',a[2]-'A'); int result=toposort(); //result=1表示拓扑序列不唯一,result=2表示有环,result=3表示有唯一的拓扑序列 if(result==2&&!no&&!sure){ printf("Inconsistency found after %d relations.\n",i+1); no=1; } if(result==3&&!sure){ printf("Sorted sequence determined after %d relations: ",i+1); for(int i=0;i<n;i++){ printf("%c",q[i]+'A'); } printf(".\n"); sure=1; } } if(!no&&!sure) printf("Sorted sequence cannot be determined.\n"); } return 0; }