poj 1094 Sorting It All Out 初级-》图算法-》拓扑排序
2012-12-14 16:07
561 查看
题意:一直到给定的第几条指令可以唯一确定一个拓扑排序的结果。 结果有三种:①、可以唯一确定;②、有环也就是矛盾;③、不能唯一确定也就是不能确定。 此题需要我们输入一条指令,执行一次拓扑排序。执行完一次拓扑排序后记得把入度再加回去。
[align=center]Sorting It All Out[/align]
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
[align=center]Sorting It All Out[/align]
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 22173 | Accepted: 7647 |
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> #include<cstring> #include<stack> #include<vector> using namespace std; vector <int> G[100]; stack<int>st1,st2; int main() { int n,m,i,j,k,len; int c1,c2,f1,f2,l1,l2,l3; int in[28]; char ch[5],str[28]; while(scanf("%d%d",&n,&m),n+m) { memset(in,0,sizeof(in)); for(i=0;i<=n;i++) // 初始化 G[i].clear(); f1=0; for(i=1;i<=m;i++) { scanf("%s",ch); G[ch[0]-'A'].push_back(ch[2]-'A'); in[ch[2]-'A']++; if(f1==0) { c1=0; f2=0; k=0; for(j=0;j<n;j++) if(in[j]==0) { st1.push(j); st2.push(j); } while(st1.size()) { if(st1.size()>=2) f2=1; l1=st1.top(); str[k++]=l1+'A'; c1++; //记录一次拓扑排序后入度为零的点的个数 st1.pop(); len=G[l1].size(); for(j=0;j<len;j++) { l2=G[l1][j]; in[l2]--; if(in[l2]==0) { st1.push(l2); st2.push(l2); } } } if(c1!=n) { f1=1; c2=i; } else { if(c1==n&&f2==0) { f1=3; c2=i; } else if(i==m&&f2==1) { f1=2; } } while(st2.size()) { l2=st2.top(); st2.pop(); len=G[l2].size(); for(j=0;j<len;j++) { l3=G[l2][j]; in[l3]++; } } } } if(f1==1) { cout<<"Inconsistency found after "; cout<<c2<<" relations."<<endl; } if(f1==2) { cout<<"Sorted sequence cannot be "; cout<<"determined."<<endl; } if(f1==3) { str ='\0'; cout<<"Sorted sequence determined after"; cout<<" "<<c2<<" relations: "; cout<<str<<"."<<endl; } } return 0; }
相关文章推荐
- POJ_1094_sorting it all out_拓扑排序
- POJ 1094 Sorting It All Out(拓扑排序)
- POJ 1094 && ZOJ 1060 Sorting It All Out 【拓扑排序入门】
- POJ 1094 Sorting It All Out(拓扑排序)
- Poj 1094 Sorting It All Out——拓扑排序
- POJ 1094 Sorting It All Out (拓扑排序)
- [ACM] POJ 1094 Sorting It All Out (拓扑排序)
- poj1094 Sorting It All Out(拓扑排序)
- POJ 1094 && ZOJ 1060 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 拓扑排序
- POJ 1094 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(拓扑排序)
- POJ 1094 Sorting It All Out 拓扑排序
- POJ 1094 Sorting It All Out 拓扑排序