K - Sorting It All Out
Crawling in process... Crawling failed Time Limit:1000MS Memory Limit:10000KB 64bit IO Format:%I64d & %I64u
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.
题意:
有N个对象和M对关系,根据这M对关系判断是否能排成一个确定的序列。
思路:
拓扑排序,用邻接矩阵表示,另外开一个数组存每个顶点的入度,每次判断出入度为0的顶点后加入新的数组中,删除该顶点,同时与之相邻的顶点入度分别-1,重复以上步骤直到所有顶点都放入到新的数组中。但是本题还有个隐含条件,每输入一对关系,如果判定有结果,则可以忽略后面输入数据,即使后面输入数据能改变结果,也不用管。所以应该每输入一个关系就去更新当前的图,然后进行一趟拓扑排序。一旦产生结果,再对后面的数据处理下,就可以输出结果。
AC:
#include<stdio.h> #include<string.h> int n,m,time,time1,time2; int temp,number,test,number2,test2; int map[50][50],degree[50],match[50]; int sort[50],end[50]; void topo() { int in,k; memset(sort,0,sizeof(sort)); for(int i=0;i<n;i++) match[i]=degree[i]; //每次都把入度数组复制在match数组中,再对match进行判断 k=0; while(k<n) { number=0; number2=0; for(int i=0;i<n;i++) { if(!match[i]) {in=i;number++;} //number是用来判断里面有多少个入度为0的顶点 if(match[i]==-1) number2++; //number2是用来判断是否出现了条件2的情况的 //有点乱来,这是不满意的地方 //因为这只是针对最后一次排序时候,出现match数组全部变成-1的情况 //全为-1说明已经全部排好序了 //如果有环的话,说明这时候match没有值为0的一项 //而排好序的话,全变成-1了,数组match里面任何一项也不会出现0 //所以会一直记录time2的时间为0 } if(number2!=n&&!number) test2=1; //如果number等于0且number2不等于n,才能说明在排序的时候没有入度为0的一项 if(number>1) test=1; //test是用来判断某次排序的时候,是否曾经出现过有环的情况 sort[k++]=in; //找到这个入度为0的顶点,放在sort中 match[in]=-1; //-1表示已经删除了这个顶点 for(int i=0;i<n;i++) if(map[in][i]>0) match[i]--; //遍历矩阵,找相邻顶点后入度-1 } } int main() { int k; char task[5]; while(scanf("%d%d",&n,&m)&&(n||m)) //n和m可以有其中一个为0的情况 { temp=0; //temp判断是三种情况中的哪一个 time1=0; //time1记录第一次完成排序的时间 time2=0; //time2记录第一次出现矛盾排序的时间 memset(map,0,sizeof(map)); memset(degree,-1,sizeof(degree)); for(time=0;time<m;time++) { int x,y; scanf("%s",task); x=task[0]-'A'; y=task[2]-'A'; //如果不加判断条件!map[x][y]的话,对于两次输入都一样的情况则会使某项入度+1 if(!map[x][y]) { if(degree[x]==-1) degree[x]=0; if(degree[y]==-1) degree[y]=1; else degree[y]++; } map[x][y]=1; //判断后标记这个点为1 if(map[x][y]==1&&map[y][x]==1&&!temp) { time2=time; temp=2; } //其实这个条件是可以忽略的,因为一开始理解错了 //这个地方需要改进,很不满意 test=0; test2=0; topo(); if(test2&&!temp) { time2=time; temp=2; } k=0; for(int i=1;i<n;i++) if(sort[i]!=sort[i-1]) k++; else break; //判断这个时候的sort序列是不是全部都是不一样的数,如果有一样的话说明还没排好序 //其实这个条件也是错误的,因为一开始写的时候没考虑清楚,后来要改动的话又会牵扯很多东西 //所以就一直放着了,这也是很不满意的地方 if(!test&&!temp&&k==n-1) { time1=time; temp=1; for(int i=0;i<n;i++) end[i]=sort[i]; //第一次排好序的时候把sort复制到end中 //因为可能不是最后一次才排好序,不是最后一次的话sort会一直变 //所以应该第一次排好的时候就复制到end中 } } if(!n) { printf("Sorted sequence determined after 1 relations: .\n"); } //这也只是针对n等于0时候的情况的,这又是一个不满意的地方 if(n) { if((time1<time2&&time2&&temp==1)||(time1&&!time2&&temp==1)||(time1==0&&temp==1)) { printf("Sorted sequence determined after %d relations: ",time1+1); for(int i=0;i<n;i++) printf("%c",end[i]+'A'); printf(".\n"); } if((time2<time1&&time1&&temp==2)||(time2&&!time1&&temp==2)||(time2==0&&temp==2)) printf("Inconsistency found after %d relations.\n",time2+1); if(!temp) printf("Sorted sequence cannot be determined.\n"); //三项判断输出,肯定有简便的地方 //一开始写觉得非常繁杂啰嗦,这也是不满意的地方 } } }
总结:
一开始并不知道题目有这个隐含条件,所以理解方面很曲折。理解了之后,敲代码的时候也非常的混乱,之后一定要抽时间再理清一遍,再认真思考后写一遍。除此之外,还需用邻接表,DFS的方法写一遍。WA很多次,后来发现错误竟然是输出句子中的其中一个单词少了个s……所以以后首先应该检查输出语句有没有错误先,代码写得很不满意,写得非常不好,过后还需要更新一次。学习一个新的算法很快,但是要运用起来真的需要很多时间,自己写的代码真的很没通用性,只针对某些条件然后再逐条加上去,这是因为思路还没很清晰造成的。
相关推荐
【标签】"POJ 1094 Sorting It All Out" 明确了这是POJ平台上编号为1094的一道关于“Sorting”(排序)的题目。在编程竞赛中,标签常用于分类题目,便于参赛者根据自己的专长选择合适的题目。 从题目名和标签我们...
**拓扑排序(Topological Sorting)** 拓扑排序是对有向无环图(DAG, Directed Acyclic Graph)的一种线性排序,使得对于图中的每条有向边 (u, v),节点u都在节点v之前。拓扑排序的结果并不唯一,因为不同的起始节点和...
拓扑排序的两种实现
拓扑排序(Topological Sorting)是一种对有向无环图(Directed Acyclic Graph,简称DAG)进行线性排序的方法。它能确保图中任何一对顶点u和v,只要在图中存在一条从u到v的有向边(即,v>∈E(G)),那么u在排序后的...
拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)中。在这个“toplogical_sort.rar”压缩包里,包含的资源可以帮助我们理解和实现这个算法。首先,我们来看看什么是拓扑排序以及...
JavaScript的拓扑排序算法。 参见 。 :warning: 该代码要求定义regeneratorRuntime ,例如,通过导入 。 // Sort anything that can be iterated over with `for (const [u, v] of ...)` import { sorted } from...
拓扑排序是图论中的一个重要概念,特别是在有向无环图(DAG,Directed Acyclic Graph)中。在计算机科学中,它常被用于解决依赖关系的排序问题,例如任务调度、编译器的语句生成等。在这个“拓扑排序应用系统java....
拓扑排序(Topological Sorting)是一种针对有向无环图(DAG,Directed Acyclic Graph)的特殊排序方法。其基本思想是对于有向图中的每条边 (u, v),确保顶点 u 在排序序列中位于顶点 v 之前。这种排序方式常被用于...
拓扑排序(Topological Sorting)是针对有向无环图(Directed Acyclic Graph,DAG)的一种排序算法。它的主要作用是从图中找出一个线性序列,使得对于图中的每条有向边(u, v),节点u出现在节点v之前。简而言之,拓扑...
pku-1094题目,详细代码,实验通过。绝对可靠,刚完成数据结构的课程设计。
3. 拓扑排序(Topological Sorting): 拓扑排序是针对有向无环图(DAG)的一种排序方法,它将图中的所有顶点排成线性序列,满足对于图中任意一条有向边u->v,顶点u在线性序列中都出现在顶点v之前。有多种实现拓扑...
3. 拓扑排序(Topological Sorting) 拓扑排序是对有向无环图(DAG)进行线性排序的一种方法,使得对于每一条有向边 (u, v),u 总是在 v 之前。有两种主要的拓扑排序方法:深度优先搜索(DFS)和广度优先搜索(BFS)...
对于这种依赖关系,很容易将其表示成一个有向无环图(Directed Acyclic Graph,DAG,无环是一个重要条件),并将寻找其中依赖顺序的过程称为拓扑排序(topological sorting)。 拓扑排序要满足如下两个条件 每个...
5. 拓扑排序(Topological Sorting): 拓扑排序是对有向无环图(DAG)的线性排序,使得对于每条有向边 (u, v),节点u总是在节点v之前。Java实现中,可以使用队列配合深度优先搜索来完成拓扑排序,或者使用栈配合...
生成一个可以控制上下界限的随机数列,并使用选择排序selection sorting算法对其排序。
"ages-automatic-sorting.rar_年龄排序"这个项目文件集显然提供了一个实现这一功能的解决方案。它可能包含了多个源代码文件,每个文件负责不同的功能,比如读取年龄数据、排序以及输出结果等。以下是对这个项目的...
在IT领域,尤其是在计算机科学和算法设计中,拓扑排序(Topological Sorting)是一种重要的图论概念,常用于解决各种依赖关系的排序问题。在这个场景中,拓扑排序被用来求解图中的最长路径问题。这里我们将深入探讨...
接下来,我们来谈谈"拓扑排序"(Topological Sorting)。拓扑排序是对有向无环图(DAG,Directed Acyclic Graph)的一种线性排序,使得对于每一条从顶点u到顶点v的有向边(u, v),都有u出现在v之前。换句话说,拓扑...