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