摘要:
简单二分匹配。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#define MAXN 205using namespace std;int N, M, G[MAXN][MAXN];int visit[MAXN], marry[MAXN];int path(int u){ for (int i = 1; i <= M; ++i) { if (!G[u][i] || visit[i]) { continue; } visit[i] = 1; if... 阅读全文
摘要:
由于没有输出交换多少次,贡献了无数次 system error。求解该题相当与给每一行找到一个1对应出现的位置,在排序就可以了。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#include <cstring>#define MAXN 105using namespace std;int N, G[MAXN][MAXN], marry[MAXN], visit[MAXN];int r1[MAXN], r2[MAXN], count;int path(int u){ for (i 阅读全文
摘要:
这题就是给定若干关系,求一个集合,该机和内部的各点之间没有任何关系,求得这个集合的元素最多为多少。代码如下:#include <cstdlib>#include <cstring>#include <cstdio>#define MAXN 500using namespace std;int N, visit[MAXN], marry[MAXN], G[MAXN][MAXN];int path(int u){ for (int i = 0; i < N; ++i) { if (!G[u][i] || visit[i]) { continue; ... 阅读全文
摘要:
对于一个有向无环图,其最小简单路径覆盖就是等于节点数减去二分图的最大匹配数,对于每条弧,弧头作为X部,弧尾作为Y部。最后在求得最大匹配的基础上,没有被匹配的Y部的点就是简单路径的起点。其个数刚好就是节点数减去二分图的最大匹配数。证明略。代码如下:#include <cstring>#include <cstdlib>#include <cstdio>#define MAXN 125using namespace std;int N, M, G[MAXN][MAXN], marry[MAXN], visit[MAXN];int path(int u){ for 阅读全文
摘要:
该题是经典的二分图匹配的应用,题义是这样的。给定K个工作,有两台机器,A机器有N种工作状态,B机器有M种工作状态,对于每一个工作,既可以被A完成又可以被B完成,求完成所有工作至少需要转换多少次模式。将A以及B的不同模式作为二分图的两个部分,工作作为边,则该题转化为求解最小顶点覆盖来求解。最小顶点覆盖:包含二分图的X,Y部的部分顶点的一个集合,使得所有的边至少有一个顶点在该点集内。最小顶点覆盖就等于二分图的最大匹配。证明如下:设二分图的最大匹配数为M(下图中M等于2),现假设下面的二分图只有 (A,a)以及(C,c)两条边,我们通过增加边来还原至原本的图。这个增加边的过程是不能够使得二分图的匹配 阅读全文
摘要:
简单二分匹配代码如下:#include <stdio.h>#include <string.h>#define MAXN 100int G[MAXN][305], N;int marry[305], visit[305];int path(int u){ for (int i = 1; i <= N; ++i) { if (!G[u][i] || visit[i]) continue; visit[i] = 1; if (!marry[i] || path(marry[i])) { marry[i] =... 阅读全文
摘要:
二部图(也叫二分图)概念:1.何为二部图 如果V(G)可以分到两个集合X,Y中,且X和Y内部没有G的边.那么图G就是一个二部图(等价于图G是可二顶点着色的)下图便是一个二部图. 2.二部图的性质 一个图是二部图当且仅当图G中没有奇环.比如说一个三角形就不可能分成两个部分,并且每个部分内部没有边,但一个正方形就可以.3.如何得到二部图的每个部分 任意选一个顶点,所有到该点距离为偶数的点构成的集合便是G中的一部分,距离为奇数的点为另一部分4.何为匹配 图G的一个匹配是一组没有公共端点的边构成的集合,如(图一)两条黑色的边构成一个大小为2的匹配,三条红色的边构成一个大小为3的匹配.图中的最... 阅读全文
摘要:
还记得杭电的“骨牌铺方格”吗,这题可以说是它的强化板了。但是思路是一样的,就是通过得到前面的解来递推后面的结果。由于是一个较大的平面,较之杭电那题在行数和列数上都有了较多的组合情况,因此状态压缩有了用武之地。这题的一个难点就是如何用0,1来表示摆放的规律,参看别人的想法后,找到的这种方法虽然时间开销相对大了点,但是思路非常好理解。对于每一个格子,只有0,1两种状态,0代表没有放置,1代表放置。对于每一行的状态,1的含义会因为上一行的对应项而不同,如果与之对应的上一行的列为0的话,那么这个1代表这里放置了一个竖直的块,如果上一列是1的话那么两行都必须是横着放置的。2411Accepted328K 阅读全文
摘要:
该题题义为有一只青蛙要过河,这条和有一个宽度,河中间有若干块石头,青蛙要求在m步的限制下跳跃到河对岸去,问在何种情况下,青蛙能够跳跃到河对岸,并且该方案中跳跃最远的一步数值最小(意思是说这种方案下对青蛙的跳跃能力的要求是最低的)。我们用二分答案的方式来解决这道题,其值可能存在的区间为 0到河的宽度L,对于这个区间中的某一个值,通过已知石头的分布来评价这个方案是否较优,那就是确定了跳跃的最大的距离,那么就让这只青蛙的允许的情况下,跳跃尽可能多的石头。再确定是否在规定的步数中跳到了对岸。代码如下:#include <cstring>#include <cstdlib>#in 阅读全文
摘要:
这题相对于前面的little kings 来说简单了一些,没有了步数的限制,dp方程也简洁了不少。只需要考虑当前状态是否与上一个状态冲突即可。代码如下:#include <cstdio>#include <cstring>#include <cstdlib>#include <iostream>#define MAXN 20000using namespace std;long long f[25][MAXN];int N, M, map[25][25], s[MAXN];inline long long max(long long &x 阅读全文