Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 29984 | Accepted: 10373 |
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.
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.
拓扑排序,看了算法导论上说用的是深搜的方法,结果看到这道题想都没想就用深搜,改了一天还是TLE。。。自己也觉得时间怎么这么长,疯了。看其他人的思路,结果结果,就是离散数学时候的那种最简单的方法啊,每一轮找入度为0的那一个啊,把这一个节点连带着与它一块的那些边一起删啊,然后再删啊,看有没有一轮入度都不为0的就坏菜了,就成环了啊,就是这么很简单的思路啊,折腾了那么久。。。
代码:
#include <iostream> #include <algorithm> #include <cmath> #include <cstdio> #include <vector> #include <string> #include <cstring> #include <list> #pragma warning(disable:4996) using namespace std; int connect[30][30],indegree[30]; int queue[30]; int n,m,flag; //我考虑的状况全是多余,不去想的情况全是考点 int solve() { int i,j,loc,m,num=0,temp[30],re=1; for(i=1;i<=n;i++) { temp[i]=indegree[i]; } for(j=1;j<=n;j++) { m=0; for(i=1;i<=n;i++) { if(temp[i]==0) { m++; loc=i; } } if(m==0) return -1; else if(m>1) { re=0;//有两个以上的入度为0的数,说明不确定。 //但此时不能返回值,因为后面可能会有矛盾的地方,即return-1的时候 } queue[++num]=loc; temp[loc]=-1; for(i=1;i<=n;i++) { if(connect[loc][i]==1) temp[i]--; } } return re; } int main() { int i; char test[10]; while(scanf("%d%d",&n,&m)==2) { if(n+m==0) break; flag=0; memset(indegree,0,sizeof(indegree)); memset(connect,0,sizeof(connect)); memset(queue,0,sizeof(queue)); for(i=1;i<=m;i++) { scanf("%s",test); int x=test[0]-'A'+1; int y=test[2]-'A'+1; indegree[y]++; connect[x][y]=1; if(i==48) { i--; i++; } int result; if(flag==0) { result=solve(); if(result==-1) { flag=-1; cout<<"Inconsistency found after "<<i<<" relations."<<endl; } else if(result==1) { flag=1; cout<<"Sorted sequence determined after "<<i<<" relations: "; int hk; for(hk=1;hk<=n;hk++) { char temp=queue[hk]+'A'-1; cout<<temp; } cout<<"."<<endl; } } } if(flag==0) { cout<<"Sorted sequence cannot be determined."<<endl; } } return 0; }
版权声明:本文为博主原创文章,未经博主允许不得转载。