题意:n个数m组比较,判断三种情况:有环,有序,无序;
思路:拓扑排序。初始时度数为0的点数大于1时,无序;度为0个数等于1时,有序;不存在度为0的数时,无序;
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
int n,m;
int mm[505][505],hh;
int q[500010],indegree[500010];
int topo()
{
int i,j,num,mark,g=1;
hh=0;
int temp[50010];
for(i=1;i<=n;i++)
temp[i]=indegree[i];
for(i=1;i<=n;i++)
{
num=0;
for(j=1;j<=n;j++)
{
if(temp[j]==0)
{
num++;
mark=j;
}
}
if(num==0) return 0;
if(num>1) g=-1;
temp[mark]=-1;
q[hh++]=mark;
for(j=1;j<=n;j++)
if(mm[mark][j]==1) temp[j]--;
}
return g;
}
int main()
{
char ch[5005];
int i,j,k,ss,vis;
while(scanf("%d%d",&n,&m)!=EOF)
{
if(n==0&&m==0) break;
memset(indegree,0,sizeof(indegree));
memset(q,0,sizeof(q));
memset(mm,0,sizeof(mm));
vis=0;
for(i=1;i<=m;i++)
{
scanf("%s",ch);
if(vis==1) continue;
int a=ch[0]-'A'+1;
int b=ch[2]-'A'+1;
mm[a][b]=1;
indegree[b]++;
ss=topo();
if(ss==0)
{
printf("Inconsistency found after %d relations.\n",i);
vis=1;
}
if(ss==1)
{
printf("Sorted sequence determined after %d relations: ",i);
for(j=0;j<hh;j++) printf("%c",q[j]+'A'-1);
printf(".\n");
vis=1;
}
}
if(ss==-1) printf("Sorted sequence cannot be determined.\n");
}
return 0;
}