POJ 1094:Sorting It All Out拓扑排序之我在这里挖了一个大大的坑

Sorting It All Out
Time Limit: 1000MS   Memory Limit: 10000K
Total Submissions: 29984   Accepted: 10373

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.

拓扑排序,看了算法导论上说用的是深搜的方法,结果看到这道题想都没想就用深搜,改了一天还是TLE。。。自己也觉得时间怎么这么长,疯了。看其他人的思路,结果结果,就是离散数学时候的那种最简单的方法啊,每一轮找入度为0的那一个啊,把这一个节点连带着与它一块的那些边一起删啊,然后再删啊,看有没有一轮入度都不为0的就坏菜了,就成环了啊,就是这么很简单的思路啊,折腾了那么久。。。

代码:

#include <iostream>
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <vector>
#include <string>
#include <cstring>
#include <list>
#pragma warning(disable:4996)
using namespace std;

int connect[30][30],indegree[30];
int queue[30];
int n,m,flag;

//我考虑的状况全是多余,不去想的情况全是考点

int solve()
{
	int i,j,loc,m,num=0,temp[30],re=1;
	for(i=1;i<=n;i++)
	{
		temp[i]=indegree[i];
	}

	for(j=1;j<=n;j++)
	{
		m=0;
		for(i=1;i<=n;i++)
		{
			if(temp[i]==0)
			{
				m++;
				loc=i;
			}
		}
		if(m==0)
			return -1;
		else if(m>1)
		{
			re=0;//有两个以上的入度为0的数,说明不确定。
			     //但此时不能返回值,因为后面可能会有矛盾的地方,即return-1的时候
		}
		queue[++num]=loc;
		temp[loc]=-1;
		for(i=1;i<=n;i++)
		{
			if(connect[loc][i]==1)
				temp[i]--;
		}
	}
	return re;
}

int main()
{
	int i;
	char test[10];
	while(scanf("%d%d",&n,&m)==2)
	{
		if(n+m==0)
			break;

		flag=0;
		memset(indegree,0,sizeof(indegree));
		memset(connect,0,sizeof(connect));
		memset(queue,0,sizeof(queue));

		for(i=1;i<=m;i++)
		{
			scanf("%s",test);

			int x=test[0]-'A'+1;
			int y=test[2]-'A'+1;

			indegree[y]++;
			connect[x][y]=1;

			if(i==48)
			{
				i--;
				i++;
			}
			int result;
			if(flag==0)
			{
				result=solve();

				if(result==-1)
				{
					flag=-1;
					cout<<"Inconsistency found after "<<i<<" relations."<<endl;
				}
				else if(result==1)
				{
					flag=1;
					cout<<"Sorted sequence determined after "<<i<<" relations: ";
					int hk;
					for(hk=1;hk<=n;hk++)
					{
						char temp=queue[hk]+'A'-1;
						cout<<temp;
					}
					cout<<"."<<endl;
				}
			}
		}
		if(flag==0)
		{
			cout<<"Sorted sequence cannot be determined."<<endl;
		}
	}
	return 0;
}



版权声明:本文为博主原创文章,未经博主允许不得转载。

posted on 2015-07-31 15:13  光速小子  阅读(162)  评论(0编辑  收藏  举报

导航