poj 1094

唉  这几天有点热 有点烦躁 以后能做成什么样。。。。 

题意:给定n个字母《0+A,...n+A》 和m个关系 想x>y  问是否能唯一确定他们的大小关系

1  在第几个关系能确定他们的排序 就输出这个位置和排序

2 如果出现矛盾就输出矛盾的位置

3 整个关系输入之后还不能确定则输出不能确定关系

#include<iostream>
#include<cstring>
using namespace std;
int map[55][55];
int in[55];
int jie[55];
int n;
int sort()//1  不能排序  ;  2 能排序
{
	int ji[55];
	int f=2;
//	memset(s,0,sizeof(s));
	int i,j;
	int x,sum;
	for(i=1;i<=n;i++)
		ji[i]=in[i];
	for(i=1;i<=n;i++)
	{
		sum=0;
		for(j=1;j<=n;j++)
			if(ji[j]==0)
			{
				sum++;
				x=j;
			}
		if(sum==0) return 1;   //是否有环
		if(sum>1) f=0;
		jie[i]=x;
		ji[x]=-1;
		for(j=1;j<=n;j++)
			if(map[x][j])
				ji[j]--;
	}
	return f;
}
int main()
{
	int yes,i;
	char s[11];
	int m;
	while(cin>>n>>m)
	{
		yes=0;
		if(n==0&&m==0)
			break;
		memset(in,0,sizeof(in));
		memset(map,0,sizeof(map));
		for(i=1;i<=m;i++)
		{
			cin>>s;
			if(yes) continue;
			int u=s[0]-'A'+1;
			int v=s[2]-'A'+1;
			if(s[1]=='<') 
			{
				if(map[v][u]) 
				{
					cout<<"Inconsistency found after "<<i<<" relations."<<endl;
					yes=1;
					continue;
				}
				map[u][v]=1;
				in[v]++;
			}
			else 
			{
				if(map[u][v]) 
				{
					cout<<"Inconsistency found after "<<i<<" relations."<<endl;
					yes=1;
					continue;
				}
				map[v][u]=1;
				in[u]++;
			}
			int x=sort();
			if(x==1)
			{	cout<<"Inconsistency found after "<<i<<" relations."<<endl;
					yes=1;
					continue;
			}
		    if(x==2)
			{
				cout<<"Sorted sequence determined after "<<i<<" relations: ";
				for(int j=1;j<=n;j++)
					cout<<(char)(jie[j]-1+'A');
				cout<<'.'<<endl;
				yes=1;
			}
		}
	
		if(!yes)
			cout<<"Sorted sequence cannot be determined."<<endl;
	}
	return 0;
}

 

posted @ 2014-06-09 17:04  _一千零一夜  阅读(154)  评论(0编辑  收藏  举报