题目链接: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 }
原文地址:https://www.cnblogs.com/Leonard-/p/8456048.html