题意:明确告诉你多少个点,多少条边,a<b可以看做,a连向b.问你能不能构成拓扑排序。
有点不同时,这里判断是一条一条加入图中,如果已经构成一个唯一的拓扑排序,后面的边就忽略(不造有这个关系W了好多次),并输出到第几条边构成拓扑排序,当然很容易想到如果一条一条检测时已构成环,也可以直接判断此图无法构成拓扑排序,输出从第几条边输入时就不能构成拓扑排序。最后只有把所有边输入完后并没有出现以上情况,才能判断构成的拓扑排序是不是唯一的。
#include<cstring>
#include<cstdio>
#include<iostream>
using namespace std;
const int Maxn=30;
int n,m,M[Maxn][Maxn],ans[Maxn],num[Maxn];
int toposort()
{
memset(num,0,sizeof(num));
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
if(M[i][j]==1) num[j]++;
int t=0,flag=1,select;
for(int i=0;i<n;i++)
{
int cnt=0;
for(int j=0;j<n;j++)
if(num[j]==0) {select=j;cnt++;}
if(cnt==0) return 0;
if(cnt>1) flag=2;
num[select]=-1;
ans[t++]=select;
for(int j=0;j<n;j++)
if(M[select][j]==1) num[j]--;
}
return flag;
}
int main()
{
while(~scanf("%d %d",&n,&m)&&n&&m)
{
int sign=0,s;
memset(M,0,sizeof(M));
// memset()
char str[5];
for(int i=0;i<m;i++)
{
scanf("%s",str);
M[str[0]-'A'][str[2]-'A']=1;
if(sign) continue;
s=toposort();
if(s==0)
{
printf("Inconsistency found after %d relations.\n",i+1);
sign=1;
}
if(s==1)
{
printf("Sorted sequence determined after %d relations: ",i+1);
for(int j=0;j<n;j++)
printf("%c",ans[j]+'A');
printf(".\n");
sign=1;
}
}
if(!sign)
printf("Sorted sequence cannot be determined.\n");
}
}