POJ1094 Sorting It All Out(拓扑排序)

本文介绍了一种通过拓扑排序来判断全序关系的算法实现。该算法利用图论中的概念,通过构建有向图并进行拓扑排序,判断给定的关系是否能够形成一个全序。文章提供了一个具体的C++实现示例,并详细解释了如何在发现全序或矛盾时及时输出结果。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题意给你字母表的前N个大写字母和M个大小关系所有的边按顺序给你,要你在能判断出全序或矛盾的时候及时输出答案,或者直到最后也不能出现全序。

思路:这道题卡在怎么在前K个已经能判断出全序了就输出,后来搜到了结论,如果能topo排序就说明没有矛盾,但是可能是全序或者偏序集.如果是全序集,那么topo排序的过程中,入度为0的点始终只会存在1个.


#include <cstdio>
#include <queue>
#include <cstring>
#include <iostream>
#include <cstdlib>
#include <algorithm>
#include <vector>
#include <map>
#include <string>
#include <set>
#include <ctime>
#include <cmath>
#include <cctype>
using namespace std;
#define maxn 50
#define LL long long
int cas=1,T;
vector<int>G[maxn];
int in[maxn];
int n,m;
char order[1000][10];
char ans[maxn];
int cnt;
int topo()
{
	cnt=0;
	queue<int>q;
	int ind[maxn];
	memcpy(ind,in,sizeof(in));
	bool flag=1;
	for (int i = 0;i<n;i++)
		if (ind[i]==0)
			q.push(i);
	while (!q.empty())
	{
		if (q.size()>1)    //q中始终只有一个元素才能保证全序
			flag=0;
		int u = q.front();q.pop();
		ans[cnt++]=u+'A';
		for (int i = 0;i<G[u].size();i++)
		{
           int v = G[u][i];
		   if (--ind[v]==0)
			   q.push(v);
		}
	}
	int result=0;
	if (cnt < n) 
		result = -1;  //存在环
	else if (flag)
		result = 1;  //已经全序
	return result;
}
int main()
{
	while (scanf("%d%d",&n,&m)!=EOF && n)
	{
		memset(in,0,sizeof(in));
		for (int i = 0;i<n;i++)
			G[i].clear();
		for (int i = 0;i<m;i++)
			scanf("%s",order[i]);
		int flag = 0;
		int i;
		for (i = 0;i<m;i++)
		{
			int u = order[i][0]-'A';
			int v = order[i][2]-'A';
			G[u].push_back(v);
			in[v]++;
			if ((flag = topo()) !=0)
				break;
		}
		ans[n]=0;
		if (flag==1)
			printf("Sorted sequence determined after %d relations: %s.\n",i+1,ans);
		else if (flag ==0)
			printf("Sorted sequence cannot be determined.\n");
		else
			printf("Inconsistency found after %d relations.\n",i+1);
	}
	//freopen("in","r",stdin);
	//scanf("%d",&T);
	//printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC);
	return 0;
}

题目

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.


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值