Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 33486 | Accepted: 11678 |
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.
坑还蛮多的题,首先是必须形成唯一的拓扑序列才能输出序列。
然后要先看有没有矛盾情况发生,再去判断是否无解。
判断是否矛盾也就是找图中有没有环。这里我用了floyd去求每个顶点到其他顶点是否连通,如果发现顶点到它自身也连通,
那就有环。
#include <iostream> #include <cstdio> #include <cstdlib> #include <cstring> #include <cmath> #include <stack> #include <bitset> #include <queue> #include <set> #include <map> #include <string> #include <algorithm> #define FOP freopen("data.txt","r",stdin) #define inf 0x3f3f3f3f #define maxn 30 #define mod 1000000007 #define PI acos(-1.0) #define LL long long using namespace std; int n, m, cot; int edge[maxn][maxn]; int ans[maxn]; int indegree[maxn]; int flag; char qus[1000][5]; bool floyd() { int mi[maxn][maxn]; for(int i = 1; i <= n; i++) for(int j = 1; j <= n; j++) mi[i][j] = edge[i][j]; for(int k = 1; k <= n; k++) { for(int i = 1; i <= n; i++) { for(int j = 1; j <= n; j++) { if(mi[i][j] > mi[i][k] + mi[k][j]) mi[i][j] = 1; } } } for(int i = 1; i <= n; i++) { if(mi[i][i] == 1) return true; } return false; } bool topu() { cot = 0; memset(ans, 0, sizeof(ans)); int ind[maxn]; for(int i = 1; i <= n; i++) ind[i] = indegree[i]; queue<int> Q; int c = 0; for(int i = 1; i <= n; i++) { if(ind[i] == 0) { Q.push(i); c++; if(c >= 2) return false; } } while(!Q.empty()) { int t = Q.front(); ans[cot++] = t, Q.pop(); c = 0; for(int i = 1; i <= n; i++) { if(edge[t][i] != inf) { ind[i]--; if(ind[i] == 0) { Q.push(i); c++; if(c >= 2) return false; } } } if(cot == n) break; } if(cot == n) return true; else return false; } int main() { //FOP; while(scanf("%d%d", &n, &m) && (n != 0 || m != 0)) { flag = 0; memset(edge, inf, sizeof(edge)); memset(indegree, -1, sizeof(indegree)); char s[5]; int a, b; int M = 0; for(int i = 1; i <= m; i++) scanf("%s", qus[i]); for(int i = 1; i <= m; i++) { a = qus[i][0] - 'A' + 1, b = qus[i][2] - 'A' + 1; if(indegree[a] == -1) indegree[a] = 0; if(indegree[b] == -1) indegree[b] = 0; if(edge[a][b] == inf) { edge[a][b] = 1, indegree[b]++; if(floyd()) { M = i; flag = 2; break; } else if(topu()) { M = i; flag = 1; break; } } } if(flag == 1) { printf("Sorted sequence determined after %d relations: ", M); for(int i = 0; i < cot; i++) printf("%c", ans[i] + 'A' - 1); printf(".\n"); } else if(flag == 2) printf("Inconsistency found after %d relations.\n", M); else printf("Sorted sequence cannot be determined.\n"); } return 0; }