拓扑排序:对每一条式子建图,然后做一次拓扑排序,每一次操作后需要判断是否有环,是否有序,如果无序则继续下一个操作。拓扑操作是先建完图后每次找入度为零的点,然后断掉这个点与图内其他点相连的边,接着继续重复,如果找不到入度为零的点则存在环
#include <iostream>
#include <cstring>
#include <string>
#include <cmath>
#include <algorithm>
#include <queue>
#include <map>
#include <vector>
#include <cstdio>
#include <cstdlib>
#include <stack>
#include <iomanip>
using namespace std;
int mapp[35][35],ru[35],q[35],cnt,tmp[35];
int n,m;
int toposort()
{
int flag=1;
int i,j,k,ori,sum;
cnt=0;
for(i=0;i<=n;i++)tmp[i]=ru[i];
for(i=1;i<=n;i++)
{
sum=0;
for(j=1;j<=n;j++)
if(tmp[j]==0)
{
sum++;
ori=j;
}
if(sum==0)return 0;
if(sum>1)flag=-1;
//cout<<sum<<' '<<flag<<endl;
q[cnt++]=ori;
tmp[ori]=-1;
for(k=1;k<=n;k++)
if(mapp[ori][k]==1)
tmp[k]--;
}
return flag;
}
int main()
{
while(cin>>n>>m)
{
if(n+m==0)break;
memset(mapp,0,sizeof(mapp));
memset(ru,0,sizeof(ru));
bool flag=false;
for(int i=1;i<=m;i++)
{
cnt=0;
string a;
cin>>a;
if(flag)continue;
int x=a[0]-'A'+1;
int y=a[2]-'A'+1;
mapp[x][y]=1;
ru[y]++;
int ans=toposort();
if(ans==0)
{
printf("Inconsistency found after %d relations.\n",i);
flag=1;
}
if(ans==1)
{
printf("Sorted sequence determined after %d relations: ",i);
for(int j=0;j<n;j++)
{
char c=q[j]+'A'-1;
cout<<c;
}
printf(".\n");
flag=1;
}
}
if(!flag)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}