这个题的题意是这样的:
给定有向边,问在输入地几个边的时候出现了确定的拓扑序列或者环,如果输入完所有边还没有结果则输出 “Sorted sequence cannot be determined.” 。
这里需要注意的是:
1、有环和有确定的拓扑序列谁先出现输出谁。
2、注意记录是在哪一个边输入之后出现的。
3、如果出现有环或有确定的拓扑序列之后边还没输入完则需要输入完所有边再输出。
下面是我的代码:
#include <stdio.h>
#include <string.h>
const int M=30;
int n,m,dis[M],cut,head[M],biao[M][M];
char c1[30];
int topo(int r)
{
int i,in=-1,ind,inde=0,di[M],flat=1;
for(i=0; i<n; i++)
{
di[i]=dis[i];
}
for(i=0; i<n; i++)
{
if(in!=-1&&di[i]==0)
{
flat=0;
break;
}
if(di[i]==0)
{
di[i]=-1;
in=i;
r--;
}
}
c1[inde]=in+'A';
inde++;
while(1)
{
ind=-1;
for(i=0; i<head[in]; i++)
{
di[biao[in][i]]--;
if(ind!=-1&&di[biao[in][i]]==0)
{
flat=0;
}
if(di[biao[in][i]]==0&&ind==-1)
{
ind=biao[in][i];
di[biao[in][i]]=-1;
r--;
}
}
if(ind==-1)
{
for(i=0; i<n; i++)
{
if(di[i]==0)
{
di[i]=-1;
ind=i;
r--;
break;
}
}
if(ind==-1)
{
break;
}
}
else
{
c1[inde]=ind+'A';
inde++;
}
in=ind;
}
if(r)
{
return 1;
}
else if(flat)
{
c1[inde]='\0';
return -1;
}
else
{
return 0;
}
}
int main()
{
while(scanf("%d%d",&n,&m),n||m)
{
memset(dis,-1,sizeof(dis));
memset(head,0,sizeof(head));
cut=0;
char s[5];
int a,b,c=2,d,i,j;
for(i=0; i<m; i++)
{
scanf("%s",s);
a=s[0]-'A';
b=s[2]-'A';
if(dis[a]==-1)
{
dis[a]=0;
cut++;
}
if(dis[b]==-1)
{
dis[b]=1;
cut++;
}
else
{
dis[b]++;
}
biao[a][head[a]]=b;
head[a]++;
c=topo(cut);
if(c==-1&&cut==n)
{
d=i;
for(i++; i<m; i++)
{
scanf("%s",s);
}
break;
}
else if(c==1)
{
d=i;
for(i++; i<m; i++)
{
scanf("%s",s);
}
break;
}
}
d++;
if(c==-1&&cut==n)
{
printf("Sorted sequence determined after %d relations: %s.\n",d,c1);
}
else if(c==1)
{
printf("Inconsistency found after %d relations.\n",d);
}
else
{
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}