题意:有一个n * n的棋盘,每个棋盘有某些矩形区域被染成了黑色(这些矩形区域有可能相交),问把所有黑色区域染成白色的最小花费是多少?你每次可以选择把一个矩形区域染成白色,花费是染色的矩形区域长和宽的最小值. 思路:容易发现,假设一个矩形的坐标是(l1, r1, l2, r2),假设(l2 - l1 < r2 - r1), 那么我们把r1和r2变成1和n对答案不会有影响.那么,我们发现问题转化为了选最少的行和列使得所有的黑色区域被覆盖,换句话说,就是所有的点至少被一个行货列所覆盖.我们把行看成左…
题目传送门 题意: 有一个$n∗n$的网格,网格中有一些矩形是黑的,其他点都是白的. 你每次可以花费$ min (h,w)$的代价把一个$h*w$的矩形区域变白.求把所有黑格变白的最小代价. 思路: 对于一列来说,如果我们要把这一列涂白,那必定会一涂到底,这样对结果只会有好处.行也是这样. 明白了这个之后,这道题就变成了一道需要离散化的最小点覆盖问题,离散化时注意这个是网格,所以$x2,y2$都需要加1处理,然后跑一边网络流即可. #pragma GCC optimize (2) #pragma…
https://codeforces.com/contest/1198/problem/D 原来是dp的思路,而且是每次切成两半向下递归.好像在哪里见过类似的,貌似是紫书的样子. 再想想好像就很显然的样子,并不会出现奇奇怪怪的合并的样子. #include<bits/stdc++.h> using namespace std; const int INF = 0x3f3f3f3f; int dp[51][51][51][51]; char g[51][51]; int main() { #if…
原题链接 大意 n*n正方形 有黑有白 每次可以选择一个 矩形把它全变成白色,代价是max(长,宽) 求吧 整个正方形 全变白 的最小代价 数据范围 n <= 50 题解 首先如果 我们刷了两个有相邻边或重叠的 白色矩形 那么 假设他们的代价分别为 x和y 那么 一定有 一个 边长为x+y的正方形 完全覆盖了这两个白色矩形 dis|row| <= rowX+roxY <= costX+costY = x+y dis|col| <= colX+roxY <= costX+cos…
Jewelry Exhibition 时间限制: 1 Sec  内存限制: 64 MB提交: 3  解决: 3[提交][状态][讨论版] 题目描述 To guard the art jewelry exhibition at night, the security agency has decided to use a new laser beam system, consisting of sender-receiver pairs. Each pair generates a strip o…
用到了二分图的一些性质, 最大匹配数=最小点覆盖 貌似在白书上有讲 还不是很懂, 自己看着别人的博客用网络流写了一遍 反正以后学白书应该会系统学二分图的,紫书上没讲深. 目前就这样吧. #include<cstdio> #include<vector> #include<cstring> #include<queue> #include<algorithm> #define REP(i, a, b) for(int i = (a); i <…
搬运工 ★ 输入文件:worker.in 输出文件:worker.out 简单对比 时间限制:1 s 内存限制:256 MB [题目描述] 小涵向小宇推荐了一款小游戏. 游戏是这样的,在一个n*n的地图中,有若干个格子上有障碍物.你需要雇佣搬运工,将这些障碍物全部清除.不过每次操作你只能让搬运工将某一行或者某一列的障碍物全部清除.如果你让搬运工清除第i行障碍物,需要付出ai元:如果你让搬运工清除第j列障碍物,需要付出bj元. 小涵告诉小宇,必须用尽可能少的次数消除这些障碍物.若有多种方案,则必须…
原题链接 此题求二分图的最小点覆盖,数值上等于该二分图的最大匹配.得知此结论可以将图染色,建有向图,然后跑匈牙利/网络流,如下.然而... #include<iostream> #include<cstdio> #include<cstring> using namespace std; const int MAXN=2000+5; int q[MAXN],hd1[MAXN],hd2[MAXN]; int lnk[MAXN]; bool vis[MAXN],bw[MAX…
//匈牙利算法-DFS //求最小点覆盖集 == 求最大匹配 //Time:0Ms Memory:208K #include<iostream> #include<cstring> #include<cstdio> #include<algorithm> using namespace std; #define MAX 105 #define INF 0x3f3f3f3f int n,m,k; int gp[MAX][MAX]; bool sx[MAX],s…
每次选择清除一行或者一列上的小行星.最少选择几次. 将行和列抽象成点,第i行为节点i+n,第j列为节点j,每个行星则是一条边,连接了所在的行列. 于是问题转化成最小点覆盖.二分图的最小点覆盖==最大匹配. #include <cstdio> #include <cstring> const int N=505<<1; int n,vis[N],link[N],g[N][N]; int find(int u) { for(int i=1; i<=n*2; i++)…
Muddy Fields Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 8881   Accepted: 3300 Description Rain has pummeled the cows' field, a rectangular grid of R rows and C columns (1 <= R <= 50, 1 <= C <= 50). While good for the grass, t…
题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=237 二分匹配--最小点覆盖模板题 Tips:用邻接矩阵超时,用数组模拟邻接表WA,暂时只有vector<>过了! 代码如下: //最小点覆盖 = 最大匹配数 //最大独立集 = N - 最大匹配数 #include "stdio.h" //二分匹配,求最小点覆盖 #include "string.h" #include "vector…
题目:http://poj.org/problem?id=2226 题意:给你一个字符矩阵,每个位置只能有"*"或者“.",连续的横着或者竖的“*"可以用一块木板覆盖,"."不能被覆盖,求最少用多少块木板才能把整张图里的"*"全覆盖住 分析:很巧妙的建图 将所有横着的连续的"*"看作二分图左边的点集,同理竖着的连续的"*"看作二分图右边的点集 如果有横着的连续的"*"…
Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 18289   Accepted: 9968 Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <= 500). The grid contains K as…
Sample Input 4 0:(1) 1 1:(2) 2 3 2:(0) 3:(0) 5 3:(3) 1 4 2 1:(1) 0 2:(0) 0:(0) 4:(0)   Sample Output 1 2 最小点覆盖=最大匹配数 水题,懒的拍了 #include<stdio.h> #include<iostream> #include<algorithm> #include<string.h> #include<vector> using n…
题目给张R×C的地图,地图上*表示泥地..表示草地,问最少要几块宽1长任意木板才能盖住所有泥地,木板可以重合但不能盖住草地. 把所有行和列连续的泥地(可以放一块木板铺满的)看作点且行和列连续泥地分别作为XY部,每一块泥地看作边.这样就构造出了一个二分图. 那么,问题就是在这个二分图中就是选出最少的点覆盖所有的边,即二分图最小点覆盖集,而二分图最小点覆盖集=二分图最大匹配. #include<cstdio> #include<cstring> #include<queue>…
最小点覆盖集就是在一个有向图中选出最少的点集,使其覆盖所有的边. 二分图最小点覆盖集=二分图最大匹配(二分图最大边独立集) 这题A机器的n种模式作为X部的点,B机器的m种模式作为Y部的点: 每个任务就作为边,端点是可以完成它的A和B的某个模式. 这样,问题就变成在这个二分图中取出最少的点覆盖所有的边. 此外,因为开始机器都是在初始在0模式下的,所以所有可以在0模式完成的任务一开始就让它们完成这样就不需要切换模式. #include<cstdio> #include<cstring>…
题目链接:http://poj.org/problem?id=1325 Machine Schedule Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 14216   Accepted: 6075 Description As we all know, machine scheduling is a very classical problem in computer science and has been studi…
题目大意:求二分图最小点覆盖和最大独立集. 题目分析:如果选中一个点,那么与这个点相连的所有边都被覆盖,使所有边都被覆盖的最小点集称为最小点覆盖,它等于最大匹配:任意两个点之间都没有边相连的最大点集称为最大独立集,它等于总节点数减去最大匹配数. 代码如下: # include<iostream> # include<cstdio> # include<cmath> # include<vector> # include<list> # inclu…
题目链接:http://poj.org/problem?id=1325 As we all know, machine scheduling is a very classical problem in computer science and has been studied for a very long history. Scheduling problems differ widely in the nature of the constraints that must be satis…
题意:在方格图上打小怪,每次可以清除一整行或一整列的小怪,问最少的步数是多少,又应该在哪些位置操作(对输出顺序没有要求). 分析:最小覆盖问题 这是一种在方格图上建立的模型:令S集表示“行”,T集表示“列”,那么小怪站的位置w(i,j),就是二分图上的边.如此建图,那么每次清除,就是把与某个点相连的边全部清除,问最少选择多少个点.(这也是最小点覆盖的概念:选择尽量少的点,使得每条边至少有一个端点被选中) 这里有一个König定理:最大二分匹配数==最小覆盖点数. 既然是求最小点覆盖,那么自然是选…
题意 给出的是N*M的矩阵,同样是有障碍的格子,要求每次只能消除一行或一列中连续的格子,最少消除多少次可以全部清除. 思路 相当于POJ 3041升级版,不同之处在于这次不能一列一行全部消掉,那些非障碍的格子不能消. 但是我们还是要抓住关键点:每个格子必须消除,要么以行消,要么以列消.并且我们发现如果以行消得话,一定是以这连续障碍行的最左端为起点,同理列是以最上端为起点.那么我们就又把消除方式变成两种了.这时就可以把障碍当作边,两种覆盖方式分别作为两断点,求二分图最小点覆盖集. 行列方式的起点共…
题目链接:http://poj.org/problem?id=1463 给你一棵树形图,问最少多少个点覆盖所有的边. 可以用树形dp做,任选一点,自底向上回溯更新. dp[i][0] 表示不选i点 覆盖子树所有边的最少点个数,那选i点的话,那么i的邻接节点都是必选的,所以dp[i][0] += dp[i.son][1] dp[i][1] 表示选i点 覆盖子树所有边的最少点个数,那么i的邻接点可选可不选(而不是一定不选,看注释样例就知道了),所以dp[i][0] += min(dp[i.son][…
给一个矩阵,里面有一些不同颜色的气球.每次能够消灭一行或一列中某一种颜色的气球,问你在k次及以内,有哪些颜色的气球是不管怎样也消不完的. 那么思路就是,对每一种颜色的气球求最小点覆盖.>k 则为答案. 相当于 poj3041的加强版,由于矩阵中不是每个点都是等价的. #include<cstdio> #include<cstring> #include<cmath> #include<iostream> #include<algorithm>…
题意 给出一个N*N的矩阵,有些格子上有障碍,要求每次消除一行或者一列的障碍,最少消除多少次可以全部清除障碍. 思路 把关键点取出来:一个障碍至少需要被它的行或者列中的一个消除. 也许是最近在做二分图匹配专辑吧--很容易想到这就是最小点覆盖集:每条边都至少需要一个点被选中,称这条边被覆盖. 而由König定理可知二分图最小点覆盖 = 最大匹配.所以解法也就出来了:把行当作左点集,列当作右点集,对于每一个障碍,把它的行和列对应的点连一条边,此二分图的最大匹配就是答案了. 代码 using name…
http://poj.org/problem?id=3041 Asteroids Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17543   Accepted: 9548 Description Bessie wants to navigate her spaceship through a dangerous asteroid field in the shape of an N x N grid (1 <= N <…
题目链接:http://poj.org/problem?id=3041 在一个n*n的地图中,有m和障碍物,你每一次可以消除一行或者一列的障碍物,问你最少消除几次可以将障碍物全部清除. 用二分图将行(左边)和列(右边)用障碍物联系起来,比如(2,3)有个障碍物,那么左边的2和右边的3连边.边的个数就是障碍物的个数,点的个数就是次数,所以问题就变成了用少的点覆盖全部的边,也就是最小点覆盖问题.二分图中,最小点覆盖=最大匹配数. //最小点覆盖 = 最大匹配 #include <iostream>…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1150 有两个机器a和b,分别有n个模式和m个模式.下面有k个任务,每个任务需要a的一个模式或者b的一个模式完成. 两个机器初始都是0模式,一个机器转换一个模式需要重启一次.问你最少需要重启几次能完成所有的任务. 不太明显的二分匹配,将每个任务的两个模式连线,大概就能看出来这是个最小点覆盖问题. /* 将下面任务的a状态和b状态连边,线的个数就是任务个数. 要使重启次数最少,那么就要使选择的点最少而且…
题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=27475 [思路] 二分图的最小点覆盖以及构造最小覆盖. 二分图的最小点覆盖即在二分图中选出最少的点使能够将所有的边覆盖.构造思路是从所有未盖点出发拓展匈牙利树,X中的未标记点与Y中的已标记点为最小覆盖集. 具体可见:http://www.tuicool.com/articles/jmAnEb [代码] #include<cstdio> #include<c…
题目地址:http://poj.org/problem?id=2226 二分图的题目关键在于建图.因为“*”的地方只有两种木板覆盖方式:水平或竖直,所以运用这种方式进行二分.首先按行排列,算出每个"*"的序号xi,再按列排序,算出序号yi. 从X集合向Y集合连边.G[xi][yi]=1; 然后就是求二分图的最小顶点覆盖.因为二分图最小点覆盖=最大匹配数.所以匈牙利算法求一下最大匹配就可以了. #include<cstdio> #include<iostream>…