Sorting It All Out
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.
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"
#define VERTEX_NUM 30
int matrix[VERTEX_NUM][VERTEX_NUM];//邻接矩阵
int indegree[VERTEX_NUM];//记录每个顶点的入度
int _indegree[VERTEX_NUM];//作为indegree副本
int letter[VERTEX_NUM];//letter[i] == 1 表示 (ch)('A' + i) 在顶点集中;
char ans[VERTEX_NUM];//存放输出的字母序
int topological_sort (int n,int sum) {//n顶点集的个数,sum当前图中(即子图)顶点的数目
int stack[VERTEX_NUM];
int front = 0;
int i;
int count = 0;
int t = 0;
for (i = 0;i < n;i++) {
if (letter[i] == 1 && _indegree[i] == 0) {
stack[front++] = i;//入度为0的顶点进栈
}
}
while (0 != front) {
int v = stack[--front];
if (0 != front) {
t = 1;//不能确定
}
ans[count++] = (char)('A' + v);
for (i = 0;i < n;i++) {
if (1 == matrix[v][i]) {
_indegree[i]--;
if (0 == _indegree[i]) {
stack[front++] = i;
}
}
}
}
ans[count] = '\0';
if (count < sum) {
return 1;//冲突
}else if (1 != t && sum == n) {
return 2;//确定
}else {
return 0;//不确定
}
}
int main () {
int n;//顶点数
int m;//边数
char ch[4];
while ( scanf ("%d%d",&n,&m), 0 != n && 0 != m) {
int i,count = 0;
int flag = 0;
getchar();
memset (matrix,0,sizeof(matrix));
memset (indegree,0,sizeof(indegree));
memset (letter,0,sizeof(letter));
for (i = 0;i < m;i++) {
int v,u;
gets(ch);
v = ch[0] - 'A';
u = ch[2] - 'A';
letter[v] = letter[u] = 1;
if (matrix[v][u] == 0) {
indegree[u]++;
}
matrix[v][u] = 1;
if (0 == flag) {
int sum = 0;
int j;
memcpy (_indegree,indegree,sizeof(indegree));
count++;
for (j = 0;j < VERTEX_NUM;j++) {
if (1 == letter[j]){
sum = sum + 1;
}
}
flag = topological_sort (n,sum);
}
}
if (0 == flag) {
printf ("Sorted sequence cannot be determined.\n");
}else if (1 == flag) {
printf ("Inconsistency found after %d relations.\n",count);
}else {
printf ("Sorted sequence determined after %d relations: %s.\n",count,ans);
}
}
return 0;
}