Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 27774 | Accepted: 9616 |
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.
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 <iostream> #include <cstdio> #include <cstring> #include <vector> using namespace std; bool visit[26]; int n, m; bool g[30][30]; vector<int>grap[30]; char res[30]; int ind[30]; void init() { for (int i = 0; i < n; i ++) { visit[i] = false; ind[i] = 0; grap[i].clear(); for (int j = 0; j < n; j ++) { g[i][j] = false; } } } bool check(int x, int y) { for (int i = 0; i < n; i ++) { for (int j = 0; j < n; j ++) { for (int k = 0; k < n; k ++) { if (g[i][k] && g[k][j]) g[i][j] = true; } } } return g[x][y]; } bool topo(int cur) { if (cur == n) { res[cur] = '\0'; return true; } int cnt = 0; int pos; for (int i = 0; i < n; i ++) { if (!visit[i] && ind[i] == 0) { pos = i; cnt ++; } } if (cnt != 1) return false; visit[pos] = true; for (int i = 0; i < grap[pos].size(); i ++) { ind[grap[pos][i]] --; } res[cur] = char(pos+65); if (topo(cur+1) == false) { visit[pos] = false; for (int i = 0; i < grap[pos].size(); i ++) { ind[grap[pos][i]] ++; } } else { return true; } return false; } int main() { while (scanf("%d%d", &n, &m), n || m) { init(); char str[10]; getchar(); bool flag = false; int ans = -1; int n_flag=-1; for (int i = 0; i < m; i ++) { scanf("%s", str); if (flag == false) { flag = check(str[2]-65, str[0]-65); if (!flag) { g[str[0]-65][str[2]-65] = true; grap[str[0]-65].push_back(str[2]-65); ind[str[2]-65] ++; if (ans == -1 && topo(0)) { ans = i+1; } } else { n_flag = i+1; } } } if (ans != -1) { printf("Sorted sequence determined after %d relations: %s.\n", ans, res); } else if (flag) { printf("Inconsistency found after %d relations.\n", n_flag); } else if (flag == false && ans == -1) { printf("Sorted sequence cannot be determined.\n"); } } return 0; }