1. 程式人生 > >POJ 1094 Sorting It All Out(拓撲排序判環)

POJ 1094 Sorting It All Out(拓撲排序判環)

sse next lan multipl sequence posit and ann sed

題目鏈接:http://poj.org/problem?id=1094

題目:

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.
題意:給定一組字母的大小關系判斷他們是否能組成唯一的拓撲序列
題解:1.先判斷是否成環2.判斷是否有序3.輸出有序結果 註意: 需要遍歷整張圖才能輸出最後的有序結果,前兩個結果出現,就直接跳出。
 1 #include <queue>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 
 7 const int N=233;
 8 int n,m;
 9 int in[N];
10 bool E[N][N];
11 queue <int> Q;
12 
13 int toposort(){
14     int F=1;
15     while(!Q.empty()) Q.pop();
16     int tmp[27];
17     for(int i=1;i<=n;i++) tmp[i]=in[i];
18     for(int i=1;i<=n;i++){
19         int cnt=0,idx;
20         for(int j=1;j<=n;j++)
21         if(tmp[j]==0) cnt++,idx=j;
22         if(cnt==0) return 0;
23         if(cnt>1) F=-1;
24         tmp[idx]--;
25         Q.push(idx);
26         for(int k=1;k<=n;k++){
27             if(E[idx][k]) tmp[k]--;
28         }
29     }
30     return F;
31 }
32 
33 int main(){
34     while(scanf("%d%d",&n,&m)!=EOF){
35         if(!n&&!m) break;
36         memset(in,0,sizeof(in));
37         memset(E,0,sizeof(E));
38         char s[10];
39         int Flag=0;
40         for(int i=1;i<=m;i++){
41             scanf("%s",s);
42             if(Flag) continue;
43             if(!E[s[0]-A+1][s[2]-A+1]){
44                 E[s[0]-A+1][s[2]-A+1]=1;
45                 in[s[2]-A+1]++;
46             }
47             int p=toposort();
48             if(p==0){
49                 printf("Inconsistency found after %d relations.\n",i);
50                 Flag=1;
51             }
52             else if(p==1){
53                 printf("Sorted sequence determined after %d relations: ",i);
54                 while(!Q.empty()){
55                     printf("%c",Q.front()+A-1);
56                     Q.pop();
57                 }
58                 printf(".\n");
59                 Flag=1;
60             }
61         }
62         if(!Flag) printf("Sorted sequence cannot be determined.\n");
63     }
64     return 0;
65 }

POJ 1094 Sorting It All Out(拓撲排序判環)