POJ-1094-Sorting It All Out

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;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值