随笔分类 -  拓扑排序

摘要:对于这样一道有着如此强烈限制条件的题目(任意两个点一定有边,而且是单向边),表示拥有各种解法,甚至连随机化的方法的AC率都不会太低。这里考虑到不会存在二个点成环的情况,那么我们要论证的就是三个以上的点成环那么就一定有三个点能够成环。对于N个点成环的情况,我们可以选取连续的三个点,如果两边的两个点的边的方向刚好使得三个点成环的话,那么就说明我们的假设成立,如果不是的话,那么就变成了N-1个点成环,以此类推,就一定能够找到3个构成的一个环。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#inc 阅读全文
posted @ 2012-08-01 10:08 沐阳 阅读(835) 评论(0) 推荐(0) 编辑
摘要:这题一个地方没注意,导致错了很多次,之后还一直没找到错误。出问题的地方就是在第一轮找入度为零的节点的时候直接找的祖先节点,导致祖先节点多次入队~~~代码如下:#include <cstring>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cmath>#include <queue>using namespace std;int N, M, set[10005], pos, cc;int rec[10005][2];char r[10005 阅读全文
posted @ 2012-07-02 10:41 沐阳 阅读(408) 评论(0) 推荐(0) 编辑
摘要:该题在给定了一些大小的关系的基础上询问是否可以断定N个数的大小关系,其实就是一个拓扑排序题。注意题义是在给定M组关系中依次处理,一旦根据1-K(1<=K<=N)能够判定是否确定或者冲突则马上退出来。如果一直到最后一组数据还没有这两种情况的话就是不能确定了。两重for循环建立边的关系,用来完成题目中要求的依次处理,对于每一种情况进行一次拓扑排序,查看是否成环或者确定关系。 成环的判定方式当每次从所有点中选取度为零的节点不能够再进行的时候,此时选取出来的点还没有N个则说明有环的存在; 如果所有的点都能够被取出来并且在整个取的过程中每次都有且尽有1个度为零的节点,那么就说明关系可以确定; 阅读全文
posted @ 2012-07-02 07:11 沐阳 阅读(368) 评论(0) 推荐(0) 编辑
摘要:Rare OrderTime Limit:3000MSMemory Limit:Unknown64bit IO Format:%lld & %llu[Submit] [Go Back] [Status]DescriptionRare OrderA rare book collector recently discovered a book written in an unfamiliar language that used the same characters as the English language. The book contained a short index, bu 阅读全文
posted @ 2011-09-08 09:21 沐阳 阅读(857) 评论(0) 推荐(0) 编辑
摘要:该题的难点在于如何去处理掉等号,这里要用到并查集来处理相同的点,不要在输入的时候处理数据,一定要先将数据全部读取完再处理,这是因为相等的点的出现是不可预见的,很可能不能把相等的点的信息全部加到一个点的邻接表上去。这里说明两条定理:*如果一次入队入度为零的点大于1则说明拓扑排序序列不唯一*如果排序的总个数小于给定的个数,则说明存在回路这两种情况就对应了不同的错误,前者则是信息不完全,后者则是冲突。当然信息不完全不能够说明它不冲突。代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>#defi 阅读全文
posted @ 2011-07-18 10:04 沐阳 阅读(342) 评论(0) 推荐(0) 编辑
摘要:这题的拓扑排序有一个一定要处理的地方就是要将一次所能够pop出来的点在一次循环中全部取出来,然后再在基本工资的基础上自增一。代码如下:#include <stdio.h>#include <string.h>#include <stdlib.h>typedef struct a{ int sign; struct a *next;} E;struct b { int cnt; struct a *next;} V[10005];int queue[10005], front, rear, M, N, hash[10005];void insert( int 阅读全文
posted @ 2011-07-17 10:47 沐阳 阅读(325) 评论(0) 推荐(0) 编辑
摘要:题中先用并查集判定是否所有点都有联系,即能够拼成一个连通的无向图。 再判定入度为零的点是否为1即可。代码如下:#include <stdio.h>#include <string.h>char name[2010][50];int cnt, N, dg[2010], hash[2010], set[2010];int find( char *n ){ int i; for( i= 0; i< cnt; ++i ) { if( strcmp( n, name[i] )== 0 ) { return i; } } strcpy( name[cnt], n ); ret 阅读全文
posted @ 2011-07-17 10:18 沐阳 阅读(246) 评论(0) 推荐(0) 编辑
摘要:确定比赛名次Time Limit: 2000/1000 MS (Java/Others)Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 3141Accepted Submission(s): 1128Problem Description有N个比赛队(1<=N<=500),编号依次为1,2,3,。。。。,N进行比赛,比赛结束后,裁判委员会要将所有参赛队伍从前往后依次排名,但现在裁判委员会不能直接获得每个队的比赛成绩,只知道每场比赛的结果,即P1赢P2,用P1,P2表示,排名时P1在P2之前。现在请你编程序 阅读全文
posted @ 2011-07-15 22:31 沐阳 阅读(775) 评论(0) 推荐(0) 编辑

点击右上角即可分享
微信分享提示