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.
传递闭包 + Floyd
关系具有传递性
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
bool d[30][30];
int n, m, cnt[30];
int main()
{
while (~scanf("%d %d\n", &n, &m) && n)
{
int i, j ,k, x, y;
char a, b;
memset(d, 0, sizeof(d));
for (k = 1; k <= n; ++k) d[k][k] = 1;//一定要加
for (k = 1; k <= m; ++k)
{
scanf("%c<%c\n", &a, &b);
x = a - 'A' + 1, y = b - 'A' + 1;
d[x][y] = 1;
for (i = 1; i <= n; ++i)
for (j = 1; j <= n; ++j)
if (d[i][x] && d[y][j])//传递性
d[i][j] = 1;
for (i = 1; i < n ; ++i)
for (j = i + 1; j <= n; ++j)
if (d[i][j] && d[j][i])//i<j&&j<i矛盾
{
printf("Inconsistency found after %d relations.\n", k);
i = n;
break;
}
else if (!d[i][j] && !d[j][i]) x = 0;//ij之间没有关系
if (i == n + 1)
break;
if (x && i == n)//所有的元素之间都有非冲突的关系
{
printf("Sorted sequence determined after %d relations: ", k);
memset(cnt, 0, sizeof(cnt));
for (i = 1; i < n; ++i)
for (j = i + 1; j <= n; ++j)
if (d[i][j]) ++cnt[i];
else ++cnt[j];
for (i = n - 1; i >= 0; --i)
for (j = 1; j <= n; ++j)
if (cnt[j] == i)
{
printf("%c", j + 'A' - 1);
break;
}
puts(".");
break;
}
}
if (k == m + 1)//读完所有数据,数据不全
printf("Sorted sequence cannot be determined.\n");
for (++k; k <= m; ++k)
scanf("%c<%c\n", &a, &b);
}
return 0;
}