poj1094 Sorting It All Out(拓扑排序)
2014-12-05 20:32
495 查看
Sorting It All Out
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
Source
East Central North America 2001
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 28422 | Accepted: 9822 |
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.
Source
East Central North America 2001
/* 此题说来话长。。。。也不长话短说了。。。。。。。。暑期碰到的一道题,之前写的一直wa,搜到的答案也很麻烦,。。。加油!!! Time:2014-12-5 20:30 */ #include<cstdio> #include<cstring> #include<algorithm> using namespace std; const int MAX=40; bool map[MAX][MAX]; int in[MAX],q[MAX],id; int topSort(int n){ int flag=1;id=0; int tempIn[MAX],numIN,pos; for(int i=1;i<=n;i++) tempIn[i]=in[i]; for(int i=1;i<=n;i++){ /*循环n次,每次找一个入度为0的标记掉 初始化则入度均为0 如果为排好序的,则刚好循环 n次, 每次都将入度为0的,每次都应该有入度为0的, */ numIN=0;pos=0; for(int j=1;j<=n;j++){ if(tempIn[j]==0){ numIN++; pos=j; } } if(numIN==0) return 0;//有环 if(numIN>1) flag=-1; //无序 ,不能直接返回,后边可能出现环 q[id++]=pos;tempIn[pos]=-1; for(int j=1;j<=n;j++){ if(map[pos][j])tempIn[j]--; } } return flag; } int main(){ char str[5]; int n,m; int flag,sign; while(scanf("%d%d",&n,&m)!=EOF){ if(n==0&&m==0)break; sign=0;id=0; memset(map,0,sizeof(map)); memset(in,0,sizeof(in)); for(int i=1;i<=m;i++){ scanf("%s",str); if(sign)continue;//排好序后其余不做处理 int u=str[0]-'A'+1; int v=str[2]-'A'+1; map[u][v]=1;in[v]++; flag=topSort(n); if(flag==0){//有环 printf("Inconsistency found after %d relations.\n",i); sign=1; }else if(flag==1){ printf("Sorted sequence determined after %d relations: ",i); for(int i=0;i<id;i++) printf("%c",q[i]+'A'-1); printf(".\n"); sign=1; }else//无序 continue; } if(!sign)puts("Sorted sequence cannot be determined."); } return 0; }
相关文章推荐
- POJ 1094 Sorting It All Out (拓扑排序) - from lanshui_Yang
- [POJ](1094)Sorting It All Out ---拓扑排序(图)
- POJ 1094 Sorting It All Out (拓扑排序)
- poj1094 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——拓扑排序
- [ACM] POJ 1094 Sorting It All Out (拓扑排序)
- POJ1094 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[拓扑排序]