摘要: 题意:有许多男女同学,他们之间互相喜欢,现要求出一个最大的独立子集出来。解法:由于题目中说明了这种喜欢关系只存在于男女之间,因此可以大胆的拆点构图,因为男的喜欢的必定是女的,而女的之间不可能存在边(喜欢关系)。最大独立子集=顶点数-最大匹配数。由于是拆点构图,需要对最后的结果除以2。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;int N, matc 阅读全文
posted @ 2013-04-07 10:46 沐阳 阅读(276) 评论(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) 编辑