Idea: Solo hay un tipo de relación. Usamos este tipo de relación como cierre transitivo y usamos floyd para completar las operaciones de cierre transitivo. Entonces juzgamos la relación entre los puntos, dis [i] [j] == 1 indica que existe la relación i <j. Si hay una contradicción, juzgamos si dis [i] [i] es 1, y si el la relación no se puede juzgar, dis [i] [j] == dis [j] [i] == 0, de lo contrario el juicio de la relación es correcto.
Código:
#pragma GCC optimize(2)#include<bits/stdc++.h>usingnamespace std;typedeflonglong ll;#define SIS std::ios::sync_with_stdio(false)#define space putchar(' ')#define enter putchar('\n')#define lson root<<1#define rson root<<1|1typedef pair<int,int> PII;typedef pair<int,PII> PIII;constint mod=100003;constint N=2e5+5;constint inf=0x7f7f7f7f;intgcd(int a,int b){
return b==0?a:gcd(b,a%b);}
ll lcm(ll a,ll b){
return a*(b/gcd(a,b));}template<classT>voidread(T &x){
char c;bool op =0;while(c =getchar(), c <'0'|| c >'9')if(c =='-')
op =1;
x = c -'0';while(c =getchar(), c >='0'&& c <='9')
x = x *10+ c -'0';if(op)
x =-x;}template<classT>voidwrite(T x){
if(x <0)
x =-x,putchar('-');if(x >=10)write(x /10);putchar('0'+ x %10);}
ll qsm(int a,int b,int p){
ll res=1%p;while(b){
if(b&1)
res=res*a%p;
a=1ll*a*a%p;
b>>=1;}return res;}int n,m;int dis[30][30];int vis[30];int g[30][30];voidfloyd(){
memcpy(dis,g,sizeof dis);for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++){
if(dis[i][j]||(dis[i][k]&& dis[k][j]))
dis[i][j]=1;}}intcheck(){
for(int i=0;i<n;i++)if(dis[i][i])return2;for(int i=0;i<n;i++)for(int j=0;j<i;j++)if(!dis[i][j]&&!dis[j][i])return0;return1;}charget_min(){
for(int i=0;i<n;i++){
if(!vis[i]){
int flag=0;for(int j=0;j<n;j++){
if(!vis[j]&&dis[j][i])
flag=1;}if(!flag){
vis[i]=1;return'A'+i;}}}}intmain(){
while(cin>>n>>m,n||m){
memset(g,0,sizeof g);int type=0,t;for(int i=0;i<m;i++){
char str[5];
cin>>str;int a=str[0]-'A',b=str[2]-'A';if(!type){
g[a][b]=1;floyd();
type=check();if(type)t=i+1;}}if(!type)puts("Sorted sequence cannot be determined.");elseif(type==2)printf("Inconsistency found after %d relations.\n",t);else{
printf("Sorted sequence determined after %d relations: ",t);memset(vis,0,sizeof vis);for(int i=0;i<n;i++)printf("%c",get_min());puts(".");}}return0;}