无谓的味道

导航

poj 1094 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.

题意:给一些大写字母的偏序关系。判断是否存在唯一的关系,或者他们的关系是矛盾的,即造成了回路,或者到最后不能确定他们的关系。

用拓扑排序:

1.拓扑排序可以用栈来实现,每次入栈的是入度为0的节点。

1.拓扑排序的结果一般分为三种情况:1、可以判断 2、有环出现了矛盾 3、条件不足,不能判断.

2.这道题不仅需要判断这三种情况,而且还要判断在处理第几个关系时出现前两种情况,对于本道题来说三种情况是有优先级的。前两种情况是平等的谁先出现先输出谁的相应结果,对于第三种情况是在前两种情况下都没有的前提下输出相应结果的.

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <stack>
 4 #include <cstring>
 5 using namespace std;
 6 const int maxn=30;
 7 int n,m;
 8 int pb[maxn][maxn],rd[maxn],list[maxn];
 9 int toposort()
10 {
11     int i,j=0;
12     int in[maxn];
13     memcpy(in,rd,sizeof(rd)); //复制入度数组,以防改变原数组
14     stack <int> s;
15     for(i=0; i<n; i++) //入度为0的入栈
16     {
17         if(!in[i])
18             s.push(i);
19     }
20     bool flag=false;
21     while(!s.empty())
22     {
23         if(s.size()>1)
24             flag=true;
25         int t=s.top(); // 记录出栈数字
26         s.pop();
27         list[j++]=t;
28         for(i=0; i<n; i++)
29         {
30             if(pb[t][i])
31             {
32                 in[i]--; //入度减一
33                 if(!in[i])
34                     s.push(i); //入度为0的继续入栈 
35             }
36         }
37     }
38     if(j!=n) //存在回路
39         return 1;
40     else if(flag) //有多重排序方式
41         return 2;
42     return 0;
43 }
44 int main()
45 {
46     while(cin>>n>>m,n||m)
47     {
48         memset(pb,0,sizeof(pb));
49         memset(rd,0,sizeof(rd));
50         char a,b;
51         int frist,scend;
52         frist=scend=0;
53         for(int i=1; i<=m; i++)
54         {
55             getchar();
56             scanf("%c<%c",&a,&b);
57             if(!frist && !scend)
58             {
59                 if(pb[b-'A'][a-'A']==1) //存在反向边
60                 {
61                     scend=1;
62                     printf("Inconsistency found after %d relations.\n",i);
63                     continue;
64                 }
65                 if(!pb[a-'A'][b-'A'])
66                 {
67                     pb[a-'A'][b-'A']=1;
68                     rd[b-'A']++;
69                 }
70                 int res=toposort();  //进行拓扑排序
71                 if(res==0) //序列能够唯一被确定
72                 {
73                     printf("Sorted sequence determined after %d relations: ",i);
74                     for(int j=0; j<n; j++)
75                         printf("%c",list[j]+'A');
76                     printf(".\n");
77                     frist=1;
78                 }
79                 else if(res==1) //存在回路
80                 {
81                     scend=1;
82                     printf("Inconsistency found after %d relations.\n",i);
83                 }
84             }
85 
86         }
87         if(!frist&&!scend) //即不能唯一约定,又不构成回路
88             printf("Sorted sequence cannot be determined.\n");
89     }
90     return 0;
91 }
View Code

 

posted on 2015-10-01 16:48  无谓的味道  阅读(166)  评论(0编辑  收藏  举报