上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 66 下一页
摘要: 题意:有许多男女同学,他们之间互相喜欢,现要求出一个最大的独立子集出来。解法:由于题目中说明了这种喜欢关系只存在于男女之间,因此可以大胆的拆点构图,因为男的喜欢的必定是女的,而女的之间不可能存在边(喜欢关系)。最大独立子集=顶点数-最大匹配数。由于是拆点构图,需要对最后的结果除以2。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int N, matc 阅读全文
posted @ 2013-04-07 10:46 沐阳 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 题意:有一块土地,某些地方被挖去了,现在允许以每相邻的两块进行出售,问最多能出售多少块出去。解法:其实相邻即曼哈顿距离为1,那么最经典的方式当然是黑白染色棋盘来进行构图了,但是这题数据量太大了,虽然知道会MLE或者TLE,不过还是写了一遍。正确的解法当然是把所有的合法的点抠出来,题目已经告诉我们这样的点不会超过50个,所以不用当心任何问题,然后就是枚举两两组合是否相邻进行构图,然后求出最大匹配出售。这个枚举过程其实也是将图进行了拆点处理,曼哈顿距离为1的组合方式确保了从一点连出去的边的另一端点内部曼哈顿距离一定不为1,所以拆点后仍可以将坐标和为奇数的点看做X部,坐标和为偶数的点看做Y部,所不同 阅读全文
posted @ 2013-04-07 10:24 沐阳 阅读(312) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一些学生和课程的关系,问是否每一门课程能唯一对应一个学生。解法:每一条边对应一个选择关系,问题就是求一个完备匹配是否存在。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>using namespace std;int P, N;char G[105][305], vis[305];int match[305];bool path(int u) { for (int i = 1; i 阅读全文
posted @ 2013-04-07 09:23 沐阳 阅读(251) 评论(0) 推荐(0) 编辑
摘要: 以前在杭电上做过,不过代码提交到POJ就WA了,原因还是程序存在一定的bug:http://www.cnblogs.com/Lyush/archive/2012/03/28/2422060.html在处理开始状态为0状态,匹配结果不进行统计的过程中,正确的处理方式应该是忽略掉所有能够工作的0状态的所有工作,因为这样的工作肯定是先让他们在0状态工作完。然后将其他的工作进行连边,然后求一个最大顶点覆盖(所有的边都至少有一个顶点落在所求顶点集合内),也即所有的工作至少能够有一台机器进行执行。代码如下:#include <cstdlib>#include <cstring>#i 阅读全文
posted @ 2013-04-07 09:03 沐阳 阅读(232) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个方格,格子中的每点由空地,草地和墙组成,每个空地可以放置一个机器人,每个机器人能够向四个方向扫射激光,所以要给定一种方案能够在棋盘上放置足够多的机器人。激光可以穿过草地但是不能够穿过墙。解法:这题其实就是经典的二分匹配构图题,做法是将行和列进行拆分,也即如果某一行中有一堵墙,那么将墙前面和后面视为不同的一行,对列进行同样的处理,那么每个空地就需要获得一个新的行和列属性,通过遍历整个图来给每一块空地分配一个行和列号。分配要尽可能的紧凑。对于任何一块空地,要占用一个行和一个列(意味着该行和该列内不能够再容下其他空地)对于每一块空地,将其所对应的行号和列号分为图两个部分,构成二分图。二 阅读全文
posted @ 2013-04-03 10:31 沐阳 阅读(325) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个棋盘,如果在某一个点放置棋子,那么这个棋子出现的行和列都不够有其他的棋子,除非他们之间有墙相隔。现在给定一个含有墙的和空地的棋盘,问最多能够放置多少棋子。解法:将所有为"."的点保存起来,如果两个点不在同一行且不在同一列,那么在两个点之间连一条边,否则判定两点之间是否有墙相隔,有的话连边,否则不连,最后求一个最大团即可。代码如下:#include <iostream>#include <cstdlib>#include <cstring>#include <cstdio>using namespace std;i 阅读全文
posted @ 2013-04-02 22:37 沐阳 阅读(192) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个邻接矩阵,求最大团。解法:直接AC。代码如下:#include <algorithm>#include <iostream>#include <cstring>#include <cstdio>#include <cstdlib>using namespace std;int N, mp[55][55];int ret, st[55], cnt[55];void dfs(int x, int num) { int flag; for (int i = x+1; i < N; ++i) { if (!mp[x][i] 阅读全文
posted @ 2013-04-02 21:05 沐阳 阅读(299) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个图,现在要给这个图上色,要求相邻的元素不能够涂上同样的颜色,一共只有两种颜色,黑色和白色。问给定的图最多能够涂上黑色点。解法:从相邻的点不能够涂上相同的颜色我们可以得出该题的实质就是要求一个最大的点独立集,而求一个图的点独立集如果所给的图是一棵树的话,就可以通过拆点转化为二分图来解了,由于给定的图很可能成环,因此化作二分图的做法在这里不再适应。另一个对应的问题就是通过对原图建一个反图,然后对反图做一个最大团的求解,最大团保证了是反图中的最大完全子集,任何两个元素之间都有边相连,反应在原图中则是任意两两之间不存在边,也就是两两不相邻,这刚好契合的题意。这是一个最简单的球最大团的版本 阅读全文
posted @ 2013-04-02 15:04 沐阳 阅读(698) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个方格,然后告诉你一些规则,这些规则下方格中的有些位置是相冲突的。问在方格中最多能够放置多少个士兵。分析:比赛时一开始就想着用状态压缩DP来搞,不过忘了相邻三行产生关系同样可以通过添加状态的维数来解,于是想着旋转45度之后再DP,这样就只有两行发生关系,不过写起来应该不太好写。后面就用二分匹配写了该题,结果一直WA,知道比赛之后才明白原来这题不能够进行拆点构图,因为从一个点引出去的边的端点相互之间是可以连边的,这就相当于一个成环了,而有环的图又怎么划分出两个内部没有边的二分图呢?其实拆点是用求树的最小路径覆盖的问题上的,这题显然不满足。正确的解法是状态压缩DP或者是求反建图的最大团 阅读全文
posted @ 2013-04-01 20:38 沐阳 阅读(1078) 评论(2) 推荐(0) 编辑
摘要: 题意:有N个国家,每个国家属于一个洲,现在有人要来攻击一些国家,每次攻击选择来自三个不同洲的国家,我们能够选择去保护一个国家,被保护的国家恐惧值-2,其余两个国家恐惧值+2,和这两个国家在一个洲的国家恐惧值+1。分析:由于超过5点恐惧值就以及超过极限了,而每次攻击又会带来其余两个洲恐惧值的增加,因此最多在不超过10天的情况下将会出现有国家超过5点恐惧值。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorith 阅读全文
posted @ 2013-03-31 22:44 沐阳 阅读(376) 评论(0) 推荐(0) 编辑
上一页 1 ··· 11 12 13 14 15 16 17 18 19 ··· 66 下一页