拓扑排序之三

//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;
}

  

posted on 2011-08-22 09:15  sysu_mjc  阅读(99)  评论(0编辑  收藏  举报

导航