poj 1094 Sorting It All Out(拓扑排序 + 邻接表)

Sorting It All Out

Time Limit: 1000MS Memory Limit: 10000K
Total Submissions: 24176 Accepted: 8361

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.

题目大意:给出一系列大小关系,要求对字母进行排序,如果出现错误或是可以的出结论,要输出在第几个关系是确定的,并且在可确定的情况下输出排列顺序。
解题思路:拓扑排序,只是每加一条边时就要进行一次判断。

#include <stdio.h>
#include <string.h>
#include <queue>
#include <vector>
using namespace std;
#define N 30
int n ,m;
int son[N], rec[N], num[N];
vector<int> G[N];

int topo(){
	memset(num, 0, sizeof(num));
	int cnt = 0, ok = 0;
	queue<int> que;
	for (int i = 0; i < n; i++)
		if (!son[i])
			que.push(i);
	
	while (!que.empty()){
		if (que.size() > 1)		ok = 1;
		int t = que.front();
		num[cnt++] = t;
		que.pop();
		for (int i = 0; i < G[t].size(); i++)
			if (--son[G[t][i]] == 0)
				que.push(G[t][i]);
	}
	if (cnt < n)
		return -1;
	else if (ok)
		return 0;
	else
		return 1;
}

int main(){
	char a, b, c;
	int cnt, over, in;
	while (scanf("%d%d", &n, &m), n && m){
		// Init.
		memset(son, 0, sizeof(son));
		memset(rec, 0, sizeof(rec));
		for (int i =  0; i < n; i++)
			G[i].clear();
		over = in = 0;

		// Read.
		for (int i = 0; i < m; i++){
			scanf("%*c%c%c%c", &a, &c, &b);
			if (c == '<'){
				G[a - 'A'].push_back(b - 'A');
				rec[b - 'A']++;
			}
			else{
				G[b - 'A'].push_back(a - 'A');
				rec[a - 'A']++;
			}

			memcpy(son, rec, sizeof(son));
			if (over)	continue;
			cnt = topo();
			if (cnt < 0){
				in = i;		
				over = 1;
			}
			else if (cnt){
				in = i;
				over = 2;
			}
		}

		// Printf.
		if (over == 1)
			printf("Inconsistency found after %d relations.\n", in + 1);
		else if (over == 2){
			printf("Sorted sequence determined after %d relations: ", in + 1);
			for (int i = 0; i < n; i++)
				printf("%c", num[i] + 'A');
			printf(".\n");
		}
		else
			printf("Sorted sequence cannot be determined.\n");
	}
	return 0;}

    原文作者:拓扑排序
    原文地址: https://blog.csdn.net/keshuai19940722/article/details/9732923
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞