POJ1094--Sorting It All Out--拓补排序
2013-02-10 23:07
323 查看
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
Sample Output
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.
#include <iostream> #include <cstdio> using namespace std; #define maxn 28 int c[maxn]; int G[maxn][maxn]; int topo[maxn]; int n,t; //判断是否矛盾可直接用刘汝佳的模板。判断是否唯一确定,一个只要夹在两个中间即可 bool dfs(int u) { c[u]=-1; for(int i=0;i<n;i++) { if(G[u][i]) { if(c[i]==-1) { return false; } else if(c[i]==0&&!dfs(i)) { return false; } } } c[u]=1;topo[--t]=u; return true; } bool toposort() { t=n; memset(c,0,sizeof(c)); for(int i=0;i<n;i++) { if(!c[i]) { if(!dfs(i)) return false; } } return true; } bool judge() { for(int i=1;i<n;i++) { if(!(G[topo[i-1]][topo[i]])) { return false; } } return true; } int main() { int m; while(scanf("%d%d",&n,&m)==2&&(n||m)) { bool flag=false,maodun=false;//flag用来判几次实现序列确定。maodun用来判断是否会矛盾 memset(G,0,sizeof(G)); char a,b,c; int sum,gg; memset(topo,0,sizeof(topo)); for(int i=1;i<=m;i++) {//之前我把topo的置0放到循环了。贡献了无数个WA。。 cin>>a>>b>>c; G[a-'A'][c-'A']=1; if(!maodun) { if(!toposort()) { maodun=true; gg=i; } else { if(!flag) { if(judge()) { flag=true; sum=i; } } } } } if(flag) { printf("Sorted sequence determined after %d relations: ",sum); for(int i=1;i<=n;i++) { char xx=topo[i-1]+'A'; cout<<xx; } cout<<"."<<endl; } else if(maodun) { printf("Inconsistency found after %d relations.\n",gg); } else cout<<"Sorted sequence cannot be determined."<<endl; } return 0; }
相关文章推荐
- POJ1094 Sorting It All Out (拓扑排序)
- Poj1094 Sorting It All Out (拓扑排序)
- poj1094 Sorting It All Out (拓扑排序)
- poj1094_Sorting It All Out_拓扑排序
- poj1094 Sorting It All Out 拓扑排序
- POJ1094:Sorting It All Out(拓扑排序)
- POJ1094 Sorting It All Out 拓扑排序判大小关系
- poj1094 Sorting It All Out
- Sorting It All Out-POJ1094
- poj 1094 Sorting It All Out (拓扑排序)
- POJ 1094 Sorting It All Out(经典拓扑,唯一排序)
- 【POJ 1094】Sorting It All Out 【topo排序 的三种情况的特判】
- (poj1094)Sorting It All Out
- 【poj 1094 Sorting It All Out 】(拓扑排序判环 + 判唯一性)
- poj 1094 Sorting It All Out 拓扑排序
- NYOJ349 Sorting It All Out(拓扑排序)
- POJ 1094-Sorting It All Out(拓扑排序)
- poj 1094 Sorting It All Out_拓扑排序
- POJ 1094 Sorting It All Out(拓扑排序)
- POJ 1094 Sorting It All Out (拓扑排序) -- 解题报告