Sorting It All Out
Time Limit: 1000MS | Memory Limit: 10000K | |
Total Submissions: 30293 | Accepted: 10496 |
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. 可以说这是一个很阴险的拓扑排序,我是反向建图做的,有三点需要注意: 1.如果有环的存在,要输出当前语句的下标(关键是这个) 2.如果已经排好序,则要在输入完成后输出顺序,并输出排序时所用到的语句的最小下标 3.如果元素不够,不足以排序,就另外输出 所以输出元素数组要一直更新! ac代码:#include<stdio.h> #include<string.h> #include<math.h> #include<stack> #include<iostream> #include<algorithm> #define MAXN 50 #define INF 0xfffffff #define max(a,b) a>b?a:b #define min(a,b) a>b?b:a using namespace std; int pri[MAXN][MAXN]; int dis[MAXN]; int s[MAXN]; int n; int topo() { int i,j,k,num,temp=2; int cas[MAXN]; int ans=0; for(i=1;i<=n;i++) cas[i]=dis[i]; for(i=0;i<n;i++) { num=0; for(j=1;j<=n;j++) { if(cas[j]==0) { k=j; num++;//记录当前最优位置的元素 } } if(num==0)//如果成环 return 0; if(num>1)//如果最优位置的元素不止一个,表明不足以排序,则标记返回,继续输入 temp=1; s[ans++]=k; cas[k]=-1; for(j=1;j<=n;j++) { if(pri[k][j]) { cas[j]--; } } } return temp; } int main() { int i,j,m; char a[5]; int k,bz,flag; while(scanf("%d%d",&n,&m)!=EOF,n||m) { bz=0; flag=0; memset(dis,0,sizeof(dis)); memset(pri,0,sizeof(pri)); for(i=1;i<=m;i++) { scanf("%s",a); if(bz||flag)//如果已经排好序或者成环了,就不用执行后面的了 continue; pri[a[0]-'A'+1][a[2]-'A'+1]=1;//反向建图 dis[a[2]-'A'+1]++; int q=topo(); if(q==0) { printf("Inconsistency found after %d relations.\n",i); bz=1; } if(q==2) { flag=i;//记录最后排好序的语句下标 } } if(flag) { printf("Sorted sequence determined after %d relations: ",flag); for(i=0;i<n;i++) printf(i==n-1?"%c.\n":"%c",s[i]+'A'-1); bz=1; } if(bz==0) printf("Sorted sequence cannot be determined.\n"); } return 0; }