首页 > 代码库 > poj1094

poj1094

受此文启发:

http://www.cnblogs.com/pushing-my-way/archive/2012/08/23/2652033.html

 

用链式表实现拓扑排序,我这里用的是栈,当然队列也是可以的。

 

#include<iostream>
#include<cstring>
#include<stack>
using namespace std;
int rudu[27],map[27][27],list[27];
int toposort(int n)
{
	bool flag;
	int i,j,rudu1[27],temp1;
	stack<int>s1;
	memcpy(rudu1,rudu,sizeof(rudu1));
	for(i=1;i<=n;i++)
	if(rudu1[i]==0)
	s1.push(i);
	i=0;
	flag=0;
	while(s1.size()!=0)
	{
		if(s1.size()>1)
		flag=1;
		temp1=s1.top();
		s1.pop();
		list[++i]=temp1;
		for(j=1;j<=n;j++)
		if(map[temp1][j]==1&&--rudu1[j]==0)
		s1.push(j);
	}
	if(i<n)
	return 1;//有环,无法形成n个元素的拓扑排序 
	else if(flag==1) 
	return 2;//没有环,但入度为0的点不唯一,当前没有形成拓扑排序,但可以形成n个元素的拓扑排序 
	return 3;//已经形成n个元素的拓扑排序 
}
int main()
{
	bool flag;
	char data[100];
	int i,n,m,ans,j;
	while(scanf("%d%d",&n,&m)&&(n!=0||m!=0))
	{
		flag=1;
		memset(rudu,0,sizeof(rudu));
		memset(map,0,sizeof(map));
		for(i=1;i<=m;i++)
		{
			scanf("%s",data);
			if(flag)
			{
				if(map[data[0]-64][data[2]-64]==0)
				{
					map[data[0]-64][data[2]-64]=1;
					rudu[data[2]-64]++;
				}
				ans=toposort(n);
				if(ans==1)
				{
					flag=0;
					printf("Inconsistency found after %d relations.\n",i);
				}
				else if(ans==3)
				{
					flag=0;
					printf("Sorted sequence determined after %d relations: ",i);
					for(j=1;j<=n;j++)
					printf("%c",list[j]+64);
					printf(".\n");
				}
			}
		}
		if(flag)
		printf("Sorted sequence cannot be determined.\n");
	}
}