1.当存在多个入度为0的点时,一定没有确定的顺序,但也有可能出现矛盾。
2.加入到队列中的点小于n是,一定存在矛盾。
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<queue>
#include<functional>
using namespace std;
int in[100],out[100];int n,m;
const int N=510*510;
int h[N],ver[N],ne[N],tot;
void add(int a,int b)
{
ver[tot]=b;
ne[tot]=h[a];
h[a]=tot++;
}
int ans=0;
char st[110];
int topsort()
{
// for(int j=1;j<=n;j++) printf("%d %d\n",j,in[j]);
queue<int>pq;
int cnt=0;
int num=0;
int flag=0;
for(int i=1;i<=n;i++)
{
if(in[i]==0)
{
pq.push(i);
num++;
if(num>1) flag=2;//这里不能直接返回2,还可能存在矛盾
}
}
while(pq.size())
{
int t=pq.front();
pq.pop();st[cnt++]=t-1+'A';
int num=0;
for(int i=h[t];i!=-1;i=ne[i])
{
if((--in[ver[i]])==0)
{
pq.push(ver[i]);
num++;
if(num>1) flag=2;//这里不能直接返回2,还可能存在矛盾
}
}
}
st[cnt]='\0';
if(cnt<n) return 0;
else if(flag==2 ) return 2;
return 1;
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF&&(n+m))
{
tot=0;
ans=0;
memset(h,-1,sizeof h);
memset(in,0,sizeof in);
memset(out,0,sizeof out);
int flag=2;
for(int i=1;i<=m;i++)
{
int a,b;
char s[10];
scanf("%s",s);
a=s[0]-'A'+1;
b=s[2]-'A'+1;
memcpy(in,out,sizeof in);
add(a,b);
in[b]++;
memcpy(out,in,sizeof out);
if(flag==0||flag==1) continue;
int tt=topsort();
if(tt==0)
{
printf("Inconsistency found after %d relations.\n",i);flag=0;
}
else if(tt==1)
{
printf("Sorted sequence determined after %d relations: %s.\n",i,st);flag=1;
}
}
if(flag==2) printf("Sorted sequence cannot be determined.\n");
}
}