摘要: 题意:这题自己YY了下,没想到结论还是对的。题目告诉我们一个有向图,现在问将图中的每一个点都划分到一个环中的最少代价是多少?每条边都有一个代价。解法:由于要成环,那么将这个图进行拆点,就变成了单向的二分图了,此时一个完备匹配就是一种连线策略,只要保证没有边是和自己相连,就能够满足题目中要求的每个点至少属于一个环。证明也是很简单的。因为我们总可以从一个完备匹配中找出起点,然后再从匹配点作为起点找......左图可以看做是1,2成环,3,4,5成环。代码如下:#include <cstdlib>#include <cstring>#include <cstdio> 阅读全文
posted @ 2013-04-16 22:22 沐阳 阅读(1032) 评论(0) 推荐(0) 编辑
摘要: 题意:给定一个二分图,N个点对应M个点,两两之间存在一组关系,每组关系一个权值。题目中了给定了一个匹配方案,现在要求满足这组关系中的最大的匹配权值在原方案上增长了多少?并且还要求求出在原匹配方案上改变最少多少条边能够得到这个最大匹配?解法:该题求增加了多少匹配值非常好算,问题就是这个最少改变多少条边。前面做过一道题目使用dfs遍历出所有的最优匹配情况,果断用在这里超时,主要原因是点过多,当然还有就是最大匹配不太好剪枝。想了许久硬了没有法子。百度......正确的解法真他妈犀利,主要思想就是增加原配边的权值,而且又不会对结果造成影响。这听起来似乎是不太可能的,但是确实有办法能够办到。首先由于顶点 阅读全文
posted @ 2013-04-16 19:06 沐阳 阅读(960) 评论(0) 推荐(0) 编辑
摘要: 题意:此乃第一道真正意义上的最大权值匹配,其他题目其实都是求一个最小权值匹配。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <iostream>#include <algorithm>using namespace std;const int INF = 0x3f3f3f3f;int N;int w[305][305];int lx[305], ly[305];int sx[305], sy[305];int match[305], slack[3 阅读全文
posted @ 2013-04-16 18:14 沐阳 阅读(217) 评论(0) 推荐(0) 编辑
摘要: 题意:给定平面上两类同样多的点,要求输出一种方案使得所有匹配的点的连线两两不相交。解法:考虑到下面的一般情况:可以很容易的证明两条交叉边的距离和一定大于两条不交叉的距离和,因此问题转化为只要原图中存在交叉边,那么就可以找到更小的匹配的方式使得总距离更小。使用KM算法求出最小权值匹配输出匹配方案即可。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <algorithm>#include <iostream>#include <cmath>u 阅读全文
posted @ 2013-04-16 16:13 沐阳 阅读(420) 评论(0) 推荐(0) 编辑