poj 1094 拓扑

Sorting It All Out
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 30276   Accepted: 10488

Description

An ascending sorted sequence of distinct values is one in which some form of a less-than operator is used to order the elements from smallest to largest. For example, the sorted sequence A, B, C, D implies that A < B, B < C and C < D. in this problem, we will give you a set of relations of the form A < B and ask you to determine whether a sorted order has been specified or not.

Input

Input consists of multiple problem instances. Each instance starts with a line containing two positive integers n and m. the first value indicated the number of objects to sort, where 2 <= n <= 26. The objects to be sorted will be the first n characters of the uppercase alphabet. The second value m indicates the number of relations of the form A < B which will be given in this problem instance. Next will be m lines, each containing one such relation consisting of three characters: an uppercase letter, the character "<" and a second uppercase letter. No letter will be outside the range of the first n letters of the alphabet. Values of n = m = 0 indicate end of input.

Output

For each problem instance, output consists of one line. This line should be one of the following three:  

Sorted sequence determined after xxx relations: yyy...y.  
Sorted sequence cannot be determined.  
Inconsistency found after xxx relations.  

where xxx is the number of relations processed at the time either a sorted sequence is determined or an inconsistency is found, whichever comes first, and yyy...y is the sorted, ascending sequence.  

Sample Input

4 6
A<B
A<C
B<C
C<D
B<D
A<B
3 2
A<B
B<A
26 1
A<Z
0 0

Sample Output

Sorted sequence determined after 4 relations: ABCD.
Inconsistency found after 2 relations.
Sorted sequence cannot be determined.

Source

East Central North America 2001
#include<cstdio>   //有环,无序,有序的判断
#include<cstring>
#include<iostream>

using namespace std;

int n,m;
int Map[100][100];
int du[100];
char out[100];
int TopSort()
{
	int temp[100];
	for(int i=0;i<n;i++)
		temp[i]=du[i];
		int flag=1;
		int num=0,c=0;
		int top;

	for(int i=0;i<n;i++)
	{
		num=0;    //
		for(int j=0;j<n;j++)
			if(temp[j]==0)
		{
			num++;
			top=j;
		}

		if(num==0)    //有环
			return 0;
		if(num>1)     //无序
			flag=-1;   //此处不能return -1,因为要先判断是否有环在判断是否无序

		out[c++]=(char)(top+'A');
		temp[top]=-1;
		for(int j=0;j<n;j++)
		{
			if(Map[top][j])
			  temp[j]--;
		}
	}
	return flag;
}
int main()
{
	//freopen("in.txt","r",stdin);
	while(~scanf("%d%d%*c",&n,&m))
	{
		if(!n&&!m)
			break;
			memset(du,0,sizeof(du));
			memset(Map,0,sizeof(Map));
			int biao=0;
		for(int i=0;i<m;i++)
		{
			char a,b;
			scanf("%c<%c%*c",&a,&b);
			if(Map[a-'A'][b-'A'])
				continue;
			if(biao)
				continue;
			Map[a-'A'][b-'A']=1;
			du[b-'A']++;
			int k=TopSort();
			if(k==0)   //有环直接输出
			{
				printf("Inconsistency found after %d relations.\n",i+1);  //在那个关系之后发现的
				biao=1;
			}
			if(k==1)  //可以将所有的点遍历完就输出
			{
			 biao=1;
			 out[n]='\0';   //只有n个字母
			 printf("Sorted sequence determined after %d relations: %s.\n",i+1,out); //漏句号了
			}
		}
		if(!biao)     //所有的点都是无序的,需全部找一遍才可确定
            printf("Sorted sequence cannot be determined.\n");

	}
}


你可能感兴趣的:(poj 1094 拓扑)