POJ 1094 拓扑排序

 http://poj.org/problem?id=1094

/*
文章大意是将n个字母排序(n<=26)。
最终必须排成链表式的输出
一旦确定或者出现环,记录当前步数,后续输入无视
*/
/*
加个拓扑排序判断图的总结:
1、如果输入的有向图中的点,不存在入度为0的点,则存在回路,反过来则不成立
2、如果入队的点的个数小于输入的点的个数,则肯定存在回路
3、如果存在的入度为零的点大于一个,则肯定不存在一个可以确定的序列

*/

#include<stdio.h>
#include<string.h>
#include<vector>
using namespace std;

int n,m;
int In[26];
vector<int> top;
vector<int> G[26];

int top_sort()
{
	int que[26*26];
	int IN[26];
	int i,j,p;
	int l=0,r=0;
	bool flag=false;
	top.clear();
	for(i=0;i<n;i++)
	{
		IN[i]=In[i];
		if(In[i]==0)
			que[r++]=i;
	}
	while(r>l)
	{
		if(r-l>1)
			flag=true;
		p=que[l++];
		top.push_back(p);
		for(i=0;i<G[p].size();i++)
		{
			int u=G[p][i];
			IN[u]--;
			if(IN[u]==0)
				que[r++]=u;
		}
	}
	if(top.size()<n)//当拓扑排序不确定的时候要先判断是否有环,特别注意!!!!!!!!!!!! 
		return 1;
	if(flag) return 0;
	return 2;
}

int main()
{
	 int i,j;
	 int state;
	 char str[26];
	 while(scanf("%d%d",&n,&m)&&n&&m)
	 {
	 	state=0;
	 	memset(G,0,sizeof(G));
	 	memset(In,0,sizeof(In));
	 	for(i=0;i<m&&state==0;i++)
	 	{
	 		scanf("%s",str);
	 		int a=str[0]-'A';
	 		int b=str[2]-'A';
	 		In[b]++;
	 		G[a].push_back(b);
	 		state=top_sort();
	 	}
	 	for(j=i;j<m;j++)
	 		scanf("%s",str);
	 	if(state==0)
	 		printf("Sorted sequence cannot be determined.\n");
	 	else if(state==1)
	 		printf("Inconsistency found after %d relations.\n",i);
 		else if(state==2)
 		{
 			printf("Sorted sequence determined after %d relations: ",i);
 			for(i=0;i<top.size();i++)
 				printf("%c",top[i]+'A');
			printf(".\n");
		}
	 }   
	 return 0;                 
}



 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值