poj1094 Sorting It All Out(拓扑排序)

来源:互联网 发布:nginx 路径 编辑:程序博客网 时间:2024/04/30 02:16
Sorting It All Out
Time Limit: 1000MS Memory Limit: 10000KTotal Submissions: 28422 Accepted: 9822

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

4 6A<BA<CB<CC<DB<DA<B3 2A<BB<A26 1A<Z0 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;}

0 0