Floyd求传递闭包
#include<bits/stdc++.h>
using namespace std;
const int N = 26;
int n,m;
string re;
bool g[N][N],d[N][N];
bool st[N];
void floyd()
{
memcpy(d,g,sizeof g);
for(int k=0;k<n;k++)
for(int i=0;i<n;i++)
for(int j=0;j<n;j++)
{
if(d[i][k] && d[k][j])
d[i][j]=1;
}
}
int check()
{
for(int i=0;i<n;i++)
if(d[i][i])
return 2;
for(int i=0;i<n;i++)
{
for(int j=0;j<i;j++)
{
if(!d[i][j] && !d[j][i])
{
return 0;
}
}
}
return 1;
}
char get_min()
{
for(int i=0;i<n;i++)
{
if(!st[i])
{
bool flag=true;
for(int j=0;j<n;j++)
{
if(!st[j] && d[j][i])
{
flag=false;
break;
}
}
if(flag)
{
st[i]=1;
return i+'A';
}
}
}
}
int main()
{
while(cin>>n>>m,n||m)
{
memset(g,0,sizeof g);
int type=0,t;
for(int i=1;i<=m;i++)
{
cin>>re;
int a=re[0]-'A',b=re[2]-'A';
g[a][b]=1;
if(!type)
{
floyd();
type=check();
if(type) t=i;
}
}
if(type==2) printf("Inconsistency found after %d relations.\n",t);
else if(type==0) printf("Sorted sequence cannot be determined.\n");
else{
memset(st,0,sizeof st);
printf("Sorted sequence determined after %d relations: ",t);
for(int i=0;i<n;i++) printf("%c",get_min());
printf(".\n");
}
}
return 0;
}