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");
	}
}

poj1094,布布扣,bubuko.com

时间: 2024-08-01 22:47:33

poj1094的相关文章

nyoj349 poj1094 Sorting It All Out(拓扑排序)

nyoj349   http://acm.nyist.net/JudgeOnline/problem.php?pid=349poj1094   http://poj.org/problem?id=1094这两个题是一样的,不过在poj上A了才算真的过,ny上数据有一点弱. 题目大意输入n,m. 一共有n个字母(从A开始), m行语句每个语句“x﹤y”,说明x,y之间的偏序关系.让你判断是否可以通过这些关系得到一个唯一的升序序列,若能则输出这个序列并指出通过前多少条语句得出的,如果n个字母间存在矛

POJ1094 拓扑排序

问题:POJ1094 本题考查拓扑排序算法 拓扑排序: 1)找到入度为0的点,加入已排序列表末尾: 2)删除该点,更新入度数组. 循环1)2)直到 1. 所有点都被删除,则找到一个拓扑排序: 2. 或剩余结点中没有入度为0的点,则原图中必存在环. 本题算法 1.依次输入一组关系 对当前关系进行拓扑排序 1)若存在环,则无法排序 2)若根据当前关系,每次循环都唯一的确定入度为0的点,则存在排序 2.若输完所有的大小关系之后,仍然没有确定大小排序,也没有发现回环,则排序无法唯一确定 AC代码: 1

POJ1094[有向环 拓扑排序]

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 33184   Accepted: 11545 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 s

POJ1094 Sorting It All Out

POJ1094 Sorting It All Out 题目链接:http://poj.org/problem?id=1094 题意:这个题意确定是有点难懂,给你n个点,和m条边.问你在添加多少条边以后n个点的拓扑顺序是确定的,或者在添加多少条边以后出现了环,如果添加完所有的边,还存在有些点之间不可排序,就说明这些关系不足以排序的. 思路:一旦n个点的已经存在拓扑关系,或者出现环,就可以结束循环了,当添加完所有的点依然无法得到n个点之间的拓扑关系,或者环,就说明无法排序的.等于说加一条边,拓扑排序

POJ1094拓扑排序

每次输入的时候 进行一次 拓扑排序. 拓扑排序时,每次查找入度为零的点只有一个,则此解为确定解.若找到确定解之后出现环(坑),继续输入,不管它. #include <cstdio> #include <cstring> #include <algorithm> #include <climits> #include <string> #include <iostream> #include <map> #include &

POJ- 1094 Sorting It All Out---拓扑排序是否唯一的判断

题目链接: https://vjudge.net/problem/POJ-1094 题目大意: 该题题意明确,就是给定一组字母的大小关系判断他们是否能组成唯一的拓扑序列.是典型的拓扑排序,但输出格式上确有三种形式: 1.该字母序列有序,并依次输出: 2.该序列不能判断是否有序(序列不唯一): 3.该序列字母次序之间有矛盾,即有环存在. 思路: 这里应该用Kahn算法拓扑排序 每加入一条边需要进行一次拓扑排序,如果拓扑排序发现有环,或者排序唯一那么就可以直接输出结果,如果所有的边输入完成还不是上述

POJ1094 / ZOJ1060

#include <cstdio> #include <cstring> #include <stack> #include <iostream> using namespace std; #define N 1005 int first[N] , in[N] , rec[N] , vis[N] , k; char str[N][5]; struct Node { int y , next; }node[N<<1]; void add_edge(

poj1094(去环)(唯一确定)topu排序

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 31940   Accepted: 11103 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 s

POJ1094 Sorting It All Out(拓扑排序)

Sorting It All Out Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 30110   Accepted: 10411 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 s