题意:给出n个字母的一些大小关系,判断能否拓扑排序或者出现了矛盾,如果是这两种情况要求出到第几组关系时就可以得到。否 则就是所给数据不完全。
思路:每读一组关系进行一次拓扑排序,如果排序成功或者出现矛盾记录第几组关系之后就不拓扑排序了,直接读完数据就行了。
#include<stdio.h>
#include<string.h>
#include<stack>
const int N=30;
using namespace std;
int map[N][N],insep[N],num,p[N],indep[N],cp[N],n,k;
int tuopusort()
{
int dep[N],i,u,pp=0; k=0;
memcpy(dep,indep,sizeof(indep));
stack<int>Q;
for(i=1;i<=n;i++)
if(dep[i]==0)Q.push(i);
while(!Q.empty())
{
if(Q.size()>1)pp=-1;
u=Q.top();
Q.pop();
p[k++]=u;
for(i=1;i<=n;i++)
{
if(map[u][i]==1)
if(--dep[i]==0)
Q.push(i);
}
}
if(k!=n) return 0;//有环
else if(pp==-1)return -1;//排序不唯一
else return 1;//排序唯一
}
int main()
{
int m,i,x,y,sum,flag,j;
char str[10];
while(scanf("%d%d",&n,&m)!=-1&&n+m)
{
flag=-1;j=-1;sum=0;
memset(map,0,sizeof(map));
memset(indep,0,sizeof(indep));
memset(cp,0,sizeof(cp));
for(i=1;i<=m;i++)
{
scanf("%s",str);
x=str[0]-'A'+1;
y=str[2]-'A'+1;
map[x][y]=1;
indep[y]++;
if(flag==-1)
{
flag=tuopusort();
j=i;
}
}
if(flag==-1){printf("Sorted sequence cannot be determined.\n");continue;}
else if(flag==1)
{
printf("Sorted sequence determined after %d relations: ",j);
for(i=0;i<k;i++)
printf("%c",'A'+(p[i]-1));
printf(".\n");
}
else printf("Inconsistency found after %d relations.\n",j);
}
return 0;
}