POJ-1094-Sorting It All Out
http://poj.org/problem?id=1094
给你一些关系式,判断这些关系式能不能唯一确定一个升序序列。
输入有三种情况:
1.经过n步能确定这n个字母的唯一的有序序列,输出Sortedsequence determined after %d relations:
2.出现环输出Inconsistencyfound after %d relations.
3.经过m次关系判断后,还不能唯一确定升序序列。输出Sortedsequence cannot be determined.
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#define M 27
int in[M],temp[M],tuopu[M];
int visit[M][M];
int n,m;//字母数,边数
int tuopusort()
{
int i,j,u,v,count;
int flag=1;
int num;//入度为0的字母
count=1;//已排序字母个数
memset(tuopu,0,sizeof(tuopu));
for(i=1;i<=n;i++)
temp[i]=in[i];
for(i=1;i<=n;i++)
{
num=0;
for(j=1;j<=n;j++) //入度为0的点
if(temp[j]==0)
{
u=j;
num++;
}
if(num==0) //含有环
return 0;
if(num>1) //有多个入度为0的点,拓扑排序不止一种
flag=0; //刚开始直接return -1,WA了一次。。。
temp[u]=-1;
tuopu[count++]=u; //加入拓扑序列
for(j=1;j<=n;j++) //删边
if(visit[u][j]==1)
temp[j]--;
}
if(flag==0)
return -1;
return 1; //排序成功
}
int main()
{
char str[5];
int i,j,start,end;
int flag,ans;
while(scanf("%d%d",&n,&m)!=EOF,n&&m)
{
memset(in,0,sizeof(in));
memset(visit,0,sizeof(visit));
flag=1;
for(i=1;i<=m;i++)
{
scanf("%s",str);
if(flag==0) //出现环
continue;
start=str[0]-'A'+1;
end=str[2]-'A'+1;
in[end]++;
visit[start][end]=1;
ans=tuopusort(); //加一条进行拓扑排序
if(ans==0) //出现环
{
printf("Inconsistency found after %d relations.\n", i);
flag=0;
}
else if(ans==1)
{
printf("Sorted sequence determined after %d relations: ", i);
for(j=1;j<=n;j++)
printf("%c",tuopu[j]+'A'-1);
printf(".\n");
flag=0;
}
}
if(flag)
printf("Sorted sequence cannot be determined.\n");
}
return 0;
}