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

来源:互联网 发布:windows 10安装大小 编辑:程序博客网 时间:2024/05/16 16:18

Sorting It All Out
Time Limit: 1000MS Memory Limit: 10000KTotal 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 6A<BA<CB<CC<DB<DA<B3 2A<BB<A26 1A<Z0 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 30int 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;elsereturn 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");}elseprintf("Sorted sequence cannot be determined.\n");}return 0;}

原创粉丝点击