拓扑排序题目
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char ch[50];
int n,m,du[30],G[30][30],tmp[30],vis[30];
int solve()
{
memcpy(tmp,du,sizeof(du));
memset(vis,0,sizeof(vis));
int flag=1;
for(int i=0;i<n;i++)
{
int s=-1,cnt=0;
for(int j=0;j<n;j++)
{
if(!vis[j]&&!tmp[j])
{
s=j;cnt++;
}
}
if(cnt!=1)
{
flag=cnt;
if(flag==0)
break;
}
ch[i]='A'+s;
vis[s]=1;
for(int j=0;j<n;j++)
if(!vis[j]&&G[s][j])
tmp[j]--;
}
ch[n]=0;
if(flag==0) return 0;
if(flag==1) return 1;
return 2;
}
int main()
{
char copy[50];
int mark1,mark2;
while(scanf("%d%d",&n,&m))
{
if(m==0&&n==0)
break;
mark1=mark2=0;
memset(G,0,sizeof(G));
memset(du,0,sizeof(du));
int s=2,flag=0;
for(int i=0;i<m;i++)
{
scanf("%s",ch);
if(flag) continue;
int u=ch[0]-'A';
int v=ch[2]-'A';
G[u][v]=1;
du[v]++;
s=solve();
if(s==2) continue;
if(s==1)
{
mark1=i+1;
strcpy(copy,ch);
flag = 1;
}
else
{
mark2=i+1;
flag = 1;
}
}
if(mark1)
{
printf("Sorted sequence determined after %d relations: %s.\n",mark1,copy);
}
if(mark2)
{
printf("Inconsistency found after %d relations.\n",mark2);
}
if(s==2)
{
puts("Sorted sequence cannot be determined.");
}
}
return 0;
}