拓撲排序:對每一條式子建圖,然後做一次拓撲排序,每一次操作後需要判斷是否有環,是否有序,如果無序則繼續下一個操作。拓撲操作是先建完圖後每次找入度爲零的點,然後斷掉這個點與圖內其他點相連的邊,接着繼續重複,如果找不到入度爲零的點則存在環
#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;
}