正确算法应该为拓扑算法
不过我用最短路也过了
不知道是不是数据太小的问题
以后在用拓扑算法把他过了
题目简单
就一拓扑顺序的题
不过我用最短路也过了
不知道是不是数据太小的问题
以后在用拓扑算法把他过了
题目简单
就一拓扑顺序的题
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
#define M 30
bool bnxt[M][M];
bool vis[M];
int g[M][M];
int n,m,to;
int ans[M],a[M];
const int FINISH=1,
FAIL=2,
NOANSWER=3;
void answer(int flag,int num)
{
if(flag==FINISH)
{
int i,j;
printf("Sorted sequence determined after %d relations: ",num);
for(i=n-1;i>=0;i--)
{
for(j=0;j<n;j++)
{
if(g[j][to]==i)
{
putchar('A'+j);
}
}
}
printf(".\n");
}
else if(flag==FAIL)
{
printf("Inconsistency found after %d relations.\n",num);
}
else
{
printf("Sorted sequence cannot be determined.\n");
}
}
bool judge()
{
int i,j,k;
bool allans=false;
while(true)
{
bool bans=false;
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
for(k=0;k<n;k++)
{
if(g[i][j]&&g[j][k]&&g[i][k]<g[i][j]+g[j][k])
{
bans=true;
g[i][k]=g[i][j]+g[j][k];
bnxt[i][k]=true;
if(g[i][k]==n-1)
{
to=k;
allans=true;
}
}
}
}
}
if(!bans)
{
break;
}
}
if(allans)
{
return true;
}
return false;
}
void read()
{
int i;
char s[20];
memset(bnxt,0,sizeof(bnxt));
memset(g,0,sizeof(g));
int nans=NOANSWER,step=0;
for(i=0;i<n;i++)
{
a[i]=1;
}
for(i=1;i<=m;i++)
{
scanf("%s",s);
if(nans!=NOANSWER)
{
continue ;
}
int u=s[0]-'A';
int v=s[2]-'A';
bnxt[u][v]=true;
if(bnxt[v][u])
{
nans=FAIL;
step=i;
}
else
{
g[u][v]=max(g[u][v],1);
if(judge())
{
nans=FINISH;
step=i;
}
}
}
answer(nans,step);
}
int main()
{
while(~scanf("%d%d",&n,&m))
{
if(n==0&&m==0)
{
break;
}
read();
}
}