Sorting It All Out
时间限制:
3000 ms | 内存限制:
65535 KB
难度:
3
-
描述
-
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 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.
输出
-
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.
样例输入
-
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
样例输出
-
Sorted sequence determined after 4 relations: ABCD. Inconsistency found after 2 relations. Sorted sequence cannot be determined.
来源
- POJ 上传者
#include<iostream> #include<cstring> #include<cstdio> #include<cmath> #include<vector> #include<algorithm> using namespace std; #define s 120 #define s 120 #define inf 0x3f3f3f3f int n,m,indegree[s],vis[s],tmp[s],rel[s][s]; char c[4],ans[s]; int toposort(){ int i,j,zero,k,flag=1; memcpy(tmp,indegree,sizeof(tmp)); memset(ans, '\0', sizeof(ans)); for (i = 0; i < n; i++) { zero = 0;//入度为0的点的个数 for (j = 0; j < n; j++){ if (tmp[j] == 0){ k = j;//下标 zero++; } } if (zero == 0) return -1;//有环 if (zero>1) flag = 0;//无序(还不能确定是否有环, 所以继续) else ans[i] = 'A' + k; tmp[k]--; for (j = 0; j < n; j++){ if (rel[k][j])//由此点出发能直达的点入度减 1 tmp[j]--; } } return flag; } int main(){ int i,j,k; while(~scanf("%d%d",&n,&m)&&n+m){ bool sure=false; memset(rel,0,sizeof(rel)); memset(indegree,0,sizeof(indegree)); for(i=1;i<=m;i++){ scanf("%s",&c); if(sure) continue; if(!rel[c[0]-'A'][c[2]-'A']){ rel[c[0]-'A'][c[2]-'A']=1; indegree[c[2]-'A']++; }//判重 int res=toposort(); if(res==1){ sure=true; printf("Sorted sequence determined after %d relations: %s.\n", i, ans); } else if(res==-1){ sure=true; printf("Inconsistency found after %d relations.\n", i); } } if(!sure) printf("Sorted sequence cannot be determined.\n"); } return 0; }
-
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.