前言
处理过程很细致,值得二刷
传送门 :
思路
对于每一次读入我们都用 f l o y d floyd floyd传递闭包,也就是实现 d i s t [ i ] [ j ] & & d i s t [ j ] [ k ] 推 出 d i s t [ i ] [ k ] dist[i][j]\&\&dist[j][k] 推出 dist[i][k] dist[i][j]&&dist[j][k]推出dist[i][k]
同时对于每一次输入之后,我们都需要判断是否所有边都联通也就是关系是否明确
最后输出关系的时候,我们需要枚举整个图反着退出最小的一个点,并且标记
CODE
//传递闭包
void floyd()
{
memcpy(d,g,sizeof d);
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 'A'+i;
}
}
}
}
void solve()
{
while(cin>>n>>m,n||m)
{
memset(g,0,sizeof g);
int type = 0, t;
//type 表示加入了当前边之后是哪种状态
//t表示确定当前状态所需的步数
for(int i=1;i<=m;i++)
{
char ch[5];
cin>>ch;
int a = ch[0] - 'A';
int b = ch[2] - 'A';
if(!type)
{
g[a][b] = 1;
floyd();
type = check();
if(type)
t = i ;
}
}
if(!type)
cout<<"Sorted sequence cannot be determined."<<endl;
else if(type == 2)
cout<<"Inconsistency found after "<<t<<" relations."<<endl;
else
{
memset(st,0,sizeof st);
cout<<"Sorted sequence determined after "<<t<<" relations: ";
for(int i = 0;i<n;i++)
cout<<get_min();
cout<<"."<<endl;
}
}
}