拓扑排序练习
本题的关键是处理好:
确定,无法确定,有环三种情况。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int n,m,flag;
int _map[100][100];
int in[1000];
int _queue[100];
int bfs()
{
memset(_queue,0,sizeof _queue);
flag=1;
int temp[100];
for(int i=0;i<n;i++)
{
temp[i]=in[i];
}
int head=0;
for(int i=0;i<n;i++)
{
int t,s;
t=0;
for(int j=0;j<n;j++)
{
if(temp[j]==0)
{
t++;
// printf("n=%d,t=%d,i=%d\n ",n,t,i);
s=j;
}
}
// printf("t=%d temp[0]=%d,temp[25]=%d\n",t,temp[0],temp[25]);
if(t==0)
{
// printf("i=%d\n",i);
return 0;
}
if(t>1)
{
flag=0;
}
_queue[head++]=s;
// printf("s=%d\n",s);
temp[s]=-1;
// printf("t=%d,s=%d\n",t,s);
for(int j=0;j<n;j++)
{
if(_map[s][j])
{
temp[j]--;
// printf("s=%d,j=%d\n",s,j);
}
}
}
if(flag)
{
return 1;
}
return -1;
}
int main()
{
// freopen("in","r",stdin);
while(scanf("%d%d",&n,&m)!=EOF)
{
int flag2=0;
if(!n&&!m)
{
break;
}
// printf("n=%d\n",n);
// getchar();
char s[10];
memset(in,0,sizeof in);
memset(_map,0,sizeof _map);
for(int i=0;i<m;i++)
{
scanf("%s",s);
int a,b;
a=s[0]-'A';
b=s[2]-'A';
if(flag2)
continue;
_map[a][b]=1;
in[b]++;
int t=bfs();
// printf("t=%d,i=%d\n",t,i);
if(t==0)
{
printf("Inconsistency found after %d relations.\n",i+1);
flag2=1;
}
if(t==1)
{
printf("Sorted sequence determined after %d relations: ",i+1);
for(int i=0;i<n;i++)
{
printf("%c",_queue[i]+'A');
}
printf(".\n");
flag2=1;
}
}
if(!flag2)
{
printf("Sorted sequence cannot be determined.\n");
}
}
return 0;
}