拓扑排序之三
//poj 1094 Sorting It All Out
#include<iostream> //拓扑排序
using namespace std;
int table[26][26],path[26],in[26],ans[26]; //in表示入度数
int main()
{
char ch[4];
int n,m,a,b,flag;
while(cin>>n>>m&&n)
{
memset(table,0,sizeof(table));
memset(ans,0,sizeof(ans));
flag=0;
for(int id=1;id<=m;++id) //每输入一组偏序关系进行一次拓扑排序
{
scanf("%s",ch);
if(flag)
continue;
a=ch[0]-'A';b=ch[2]-'A';
table[a][b]=1;
ans[b]++;
for(int i=0;i<n;++i) //因为入度in的值在拓扑时会改变,所以需要记录原始数值
in[i]=ans[i];
int rear=0;
bool sole=true;
//sole标记序列是否唯一:只有在拓扑排序过程中每次都只有一个顶点的入度为0,序列才能最终唯一
for(int i=0;i<n;++i)
{
if(in[i]==0)
path[rear++]=i;
}
if(rear>1)
sole=false;
for(int i=0;i<rear;++i)
{
int add=0;
for(int j=0;j<n;++j)
if(table[path[i]][j]==1)
{
in[j]--;
if(in[j]==0)
{
path[rear++]=j;
add++;
}
}
if(add>1)
sole=false;
}
if(rear<n) //存在回路
{
printf("Inconsistency found after %d relations.\n",id);
flag=1;
}
else if(sole==true) //序列唯一
{
printf("Sorted sequence determined after %d relations: ",id);
for(int i=0;i<rear;++i)
printf("%c",path[i]+'A');
printf(".\n");
flag=1;
}
}
if(flag==0)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}