Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22726 | Accepted: 7859 |
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.
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.
题意:给出字符的个数(26个字母),给出若干个他们之间的关系,问是否有唯一的排序方式,有输出,如果没有就输出第几个关系没找到。如果不确定,输出Sorted sequence cannot be determined.
#include<iostream> #include<stdio.h> #include<string.h> #include<memory.h> using namespace std; int map[27][27],q[27],deg[27]; int Toposort(int n) { int c=0,temp[27],loc,m,flag=1; for(int i=1; i<=n; i++) temp[i]=deg[i]; for(int i=1; i<=n; i++) { m=0; for(int j=1; j<=n; j++) if(temp[j]==0) { m++; loc=j; } if(m==0)return 0;//有环 if(m>1)flag=-1;//无序 q[c++]=loc; temp[loc]=-1; for(int j=1; j<=n; j++) if(map[loc][j]==1) temp[j]--; } return flag; } int main() { int m,n,flag; char b[5]; while(cin>>m>>n) { memset(map,0,sizeof(map)); memset(deg,0,sizeof(deg)); if(m==0&&n==0)break; flag=0; for(int i=1; i<=n; i++) { scanf("%s",b); if(flag)continue; int x=b[0]-'A'+1; int y=b[2]-'A'+1; map[x][y]=1; deg[y]++; int s=Toposort(m); if(s==0) { cout<<"Inconsistency found after "<<i<<" relations."<<endl; flag=1; } if(s==1) { cout<<"Sorted sequence determined after "<<i<<" relations: "; for(int j=0; j<m; j++) printf("%c",q[j]-1+'A'); cout<<"."<<endl; flag=1; } } if(!flag) { cout<<"Sorted sequence cannot be determined."<<endl; } } return 0; }