您的位置:首页 > 其它

poj1094_Sorting It All Out_拓扑排序

2017-04-19 21:29 267 查看
poj1094题目链接

有三种情况:

              1.有序

              2.无序

              3.有环

拓扑排序可以判断是否有环或有序,除此以外就是无序了。并且1,3情况下只要判断后之后的输入就无影响,2必须要把所有顶点遍历完后才能确定。

建议在把排序时候把每次入度为0的顶点输出调试一下,更有助与理解。

#include<stdio.h>
#include<string.h>
int map[26][26],indegree[26],q[26];
int TopSort(int n)
{
int t=0,i,j,flag=1,temp[26],loc,vis;
for(i=0;i<n;i++)
temp[i]=indegree[i];

for(i=0;i<n;i++)
{
vis=0;
for(j=0;j<n;j++)
{
if(temp[j]==0)
{
vis++;
loc=j;
}

}

if(vis==0) return 0;
if(vis>1) flag=-1;
q[t++]=loc;

temp[loc]=-1;
for(j=0;j<n;j++)
if(map[loc][j]==1)
temp[j]--;
}

return flag;
}

int main()
{
int sign,n,m,i,j;
while(scanf("%d%d",&n,&m)&&n+m)
{
char str[5];
memset(map,0,sizeof(map));
memset(indegree ,0,sizeof(indegree));

sign=0;
for(i=1;i<=m;i++)
{

scanf("%s",str);
//gets(str);
if(sign)continue;
int x=str[0]-'A';
int y=str[2]-'A';
map[x][y]=1;
indegree[y]++;
int s=TopSort(n);
if(s==0)
{

printf("Inconsistency found after %d relations.\n",i);
sign=1;
}
if(s==1)
{

printf("Sorted sequence determined after %d relations: ",i) ;
for(j=0;j<n;j++)
printf("%c",q[j]+'A');
printf(".\n");
sign=1;
}
}
if(!sign)
{
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: