第i个物品 第几重// 逆向拓扑
# include <stdio.h>
# include <algorithm>
using namespace std;
int n,m,top,map[27][27],into[27],outto[27];
char str[27],buf[10];
int floyd()
{
int i,j,k;
for(k=0;k<n;k++)
{
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map[i][k]&&map[k][j])
map[i][j]=1;
}
}
}
for(i=0;i<n;i++)
{
if(map[i][i])//成环 矛盾
return 0;
}
return 1;
}
int calc()//在floyd的基础上!!!
{
int i,j;
memset(into,0,sizeof(into));//每次清空入度出度
memset(outto,0,sizeof(outto));
for(i=0;i<n;i++)
{
for(j=0;j<n;j++)
{
if(map[i][j])
{
into[j]++;
outto[i]++;
}
}
}
for(i=0;i<n;i++)
if(into[i]+outto[i]!=n-1)
return 0;
return 1;// 全部的点 出度加入度==n-1 so 可以判断顺序
}
void topsort()
{
top=0;
int i,j;
int k=0;
while(top<n)
{
top++;
for(i=0;i<n;i++)
{
if(into[i]==0)
{
into[i]--;
break;
}
}
str[k]=i+'A';
k++;
for(j=0;j<n;j++)
{
if(map[i][j])
into[j]--;
}
}
str[k]='\0';
}
int main()
{
int i;
while(~scanf("%d%d",&n,&m),n+m)
{
memset(map,0,sizeof(map));
int flag1=0,flag2=0;
for(i=1;i<=m;i++)
{
scanf("%s",buf);
map[buf[0]-'A'][buf[2]-'A']=1;
if(flag1||flag2)
continue;
else if(!floyd())//成环 矛盾
{
flag1=i;//第i步出现矛盾
continue;
}
else if(calc())
{
topsort();
flag2=i; //之后 到if 的continue
}
}
if(flag1)
printf("Inconsistency found after %d relations.\n",flag1);
else if(flag2)
printf("Sorted sequence determined after %d relations: %s.\n",flag2,str);
else
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}
poj 1094
最新推荐文章于 2019-04-18 19:09:27 发布