poj——1094——Sorting It All Out(拓扑排序)
2014-01-23 15:59
483 查看
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 <cstring> #include <cstdio> #include <algorithm> using namespace std; #define MAXN 28 bool adj[MAXN][MAXN]; int in_degree[MAXN]; char str[MAXN]; int n,m; int topo_sort() { int i,j,k; bool flag=true; memset(in_degree,0,sizeof(in_degree)); memset(str,'\0',sizeof(str)); for(i=1; i<=n; i++) { for(j=1; j<=n; j++) if(adj[i][j]) in_degree[j]++; //入度加一 } for(i=1; i<=n; i++) //每次产生一个字符 { k=0; for(j=1; j<=n; j++) { if(in_degree[j]==0) { if(k==0) k=j; else flag=false; //还有入度为零的节点 } } if(k==0) return 0; //没有入度为零的节点,即存在环 in_degree[k]=-1; str[i-1]=k+'A'-1; for(j=1; j<=n; j++) //k指向的节点入度都减一,即去掉A及它相关的边 { if(adj[k][j]) in_degree[j]--; } } if(flag) return 1; //没有入度为零的点,完成排序 else return 2; //排序没有完成 } int main() { int i,a,b,result; char s[4]; // freopen("acm.txt","r",stdin); while(scanf("%d%d",&n,&m),m+n) { memset(adj,false,sizeof(adj)); bool h=false; for(i=1; i<=m; i++) { scanf("%s",s); a=s[0]-'A'+1; b=s[2]-'A'+1; adj[a][b]=true; if(h) continue; //必须有,因为还要继续把剩下的数据都读完 result=topo_sort(); if(result==1) { printf("Sorted sequence determined after %d relations: %s.\n",i,str); h=true; } if(result==0) { printf("Inconsistency found after %d relations.\n",i); //有换存在 h=true; } } if(!h) printf("Sorted sequence cannot be determined.\n"); } return 0; }
相关文章推荐
- 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(拓扑排序 + floyd)
- POJ 1094 Sorting It All Out (拓扑排序,有向图判环)
- POJ1094 Sorting It All Out 拓扑排序
- poj1094 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 && NYOJ 349 Sorting It All Out 拓扑排序 经典
- POJ 1094 Sorting It All Out (拓扑排序)
- [ACM] 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 && ZOJ 1060 Sorting It All Out 【拓扑排序入门】