这题数据量较小,用了比较暴力的方法
A<B看作A到B的有向路径,每一条路径再分别连接两点前后的路径
当路径数满足 n*(n-1)/2是得出拓扑结构
#include<iostream>
#include <string>
#include<vector>
#include<algorithm>
#include<set>
#include<fstream>
#include<cmath>
using namespace std;
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define sqr(i) ((i)*(i))
#define pii pair<int,int>
#define mp make_pair
#define FOR(i,b,e) for(int i=b;i<=e;i++)
#define ms(a) memset(a,0,sizeof(a))
const int maxnum = 30;
const int inf = 100005;
int road[maxnum][maxnum];
bool vis[maxnum],vis1[maxnum];
int seq[maxnum];
int n,m;
int main()
{
//ifstream fin("G:/1.txt");
char str[4];int u,v,flag1,flag3,sum;
while(1){
scanf("%d%d",&n,&m);
//fin>>n>>m;
if(n==0&&m==0)break;
flag1=flag3=sum=0;
ms(road);ms(vis1);ms(seq);
FOR(i,1,n)road[i][i]=1;
FOR(i,1,m){
//fin>>str;
scanf("%s",str);
if(flag1||flag3)continue;
u=str[0]-'A'+1;v=str[2]-'A'+1;
if(road[v][u]) {flag3=i;continue;}
if(road[u][v]) continue;
FOR(j,1,n){
FOR(k,1,n){
if(road[j][u]&&road[v][k]&&!road[j][k]){
road[j][0]++;
sum++;
road[j][k]=1;
}
}
}
if(sum==n*(n-1)/2)flag1=i;
}
if(flag1==0&&flag3==0){
printf("Sorted sequence cannot be determined.\n");
}
else if(flag3){
printf("Inconsistency found after %d relations.\n",flag3);
}
else if(flag1){
printf("Sorted sequence determined after %d relations: ",flag1);
FOR(i,1,n){
seq[road[i][0]]=i;
}
for(int i=n-1;i>=0;i--){
printf("%c",seq[i]-1+'A');
}
printf(".\n");
}else printf("!\n");
}
return 0;
}