
匹配问题
文章平均质量分 80
cillyb
这个作者很懒,什么都没留下…
展开
-
hdoj 2444 The Accomodation of Students(裸的二分图判定+匈牙利)
题意:一些学生之间是朋友关系(关系不能传递),现在要将一堆学生分成两堆,使得在同一堆的学生之间没有朋友关系。如果不可以输出“No”,可以的话输出最多可以分出几对小盆友(最大匹配)。思路:裸的二分图判定和匈牙利算法(匈牙利算法)代码:#includeusing namespace std;const int maxn = 205;vector e[maxn];原创 2017-02-17 16:21:37 · 486 阅读 · 0 评论 -
poj 1422 Air Raid(最小路径覆盖)
题目地址:点击打开链接思路:每一个点差点分成两个,一个进一个出,那么显然二分图匹配,每一个点只能一进一出,那么匹配出来的边的数量就是当前这个图上有多少条边可以缩成一个点,最小路径覆盖 = 总点数n - 最大匹配.代码:#include#include#include#includeusing namespace std;const int maxn = 1原创 2017-03-02 17:49:23 · 465 阅读 · 0 评论 -
POJ 2594 Treasure Exploration (最小路径覆盖+传递闭包(解决可重点))
题目地址:点击打开链接题意:有n个地点,现在给出m条单向道路,问最少放多少人可以覆盖所有点,一个地点可以重复经过。思路:这题和POJ1422很像,但有个关键的差别,1422每个点只能经过一次,而这题可以重复经过。如果只能经过一次,那么直接匈牙利就行,但如果可以经过多次,就需要先利用floyd求解下传递闭包加一些新边再来求解。#in原创 2017-03-21 00:31:39 · 432 阅读 · 0 评论 -
POJ 3041 Asteroids(最小顶点覆盖)
题目地址:点击打开链接题意:给一个N*N的矩阵,有些格子有障碍,要求我们消除这些障碍,问每次消除一行或一列的障碍,最少要几次。思路:关键是构图,把每行看作X集合中的一个点,每列看作Y集合中的一个点,这样每个障碍的行号列号对应连接XY集合的一条边。现在要用最少点的点覆盖所有的障碍(也就是边),这就变成了最小顶点覆盖问题了。最小顶点数=最大匹配。原创 2017-03-30 13:26:53 · 570 阅读 · 0 评论 -
二分图最大匹配相关问题
在讲述这两个算法之前,首先有几个概念需要明白:二分图:二分图又称二部图,是图论中的一种特殊模型。设G=(V,E)是一个无向图,如果顶点V可以分割为两个互不相交的子集(A,B),并且图中的每条边(i,j)所关联的两个顶点i和j分别属于这两个不同的顶点集(i in A, j in B), 则称图G是二分图。匹配:给定一个二分图,在G的一个子图G’中,如果G’的边集中的任转载 2017-03-08 22:52:30 · 470 阅读 · 0 评论 -
QDUOJ 29 帅气的HYC与N皇后(最大独立集)
题目地址:点击打开链接思路:暴搜肯定是会T的,每个位置和他一步能到的八个地方存在互斥关系,所以可以看作一个棋盘中有许许多多的互斥关系,互斥关系的两个点不能同时有棋子,所以可以将互斥关系作边,从而问题转换成了求最大独立集。(最大独立集=定点数 - 最大匹配)独立集:在所有的顶点中选取一些顶点,这些顶点两两之间没有连线,这些点就叫独立集最大独立集:原创 2017-04-03 17:13:00 · 632 阅读 · 0 评论 -
HDU 3605 Escape (二分图多重匹配模板)
题意:给出每个人适合住的星球信息和该星球能住多少人 第一行给出n m 代表有 n 个人 m 个星球然后接下来n行每行m个数字 1代表适合第 i 个星球 0 代表不适合第 i 个星球最后一行m个数表示第 i 个星球最多可以住多少个人问是不是所有人都可以住到星球上思路:匈牙利算法可以解决多重匹配,原理和二分图最大匹配很像。注意不要把可以匹配多个的点分割然后按照正原创 2017-05-02 12:05:02 · 511 阅读 · 0 评论 -
HDU 1533 Going Home (二分图最小权匹配 KM模板)
题意:n*m的方格中有p个房子和p个人,人走一步花费1元,要求每个人都要找到一个房子,且每个房子里只能有一个人,问p个人都找到各自的房子,最小的花费是多少。思路:以每个人到所有房子的曼哈顿距离的相反数为权值建边,套下KM就是最小权匹配。#include#include#include#include#includeusing namespace std;cons原创 2017-05-04 15:36:16 · 474 阅读 · 0 评论 -
POJ 3686 The Windy's (二分图最小权匹配 拆点 构图)
题意:有n个订单m个车间,每个车间均可以单独完成任何一个订单。每个车间完成不同订单的时间是不同的。不会出现两个车间完成同一个订单的情况。给出每个订单在某个车间完成所用的时间。问订单完成的平均时间是多少。思路:1、这个题在建图上有一些需要思考很长时间的地方。因为每个订单所消耗的时间是车间完成订单的时间加上订单等待的时间。我们设在车间A需要完成k个订原创 2017-05-04 16:11:45 · 430 阅读 · 0 评论 -
codevs 1222 信与信封问题(二分图匹配 可确定的关系)
题意:John先生晚上写了n封信,并相应地写了n个信封将信装好,准备寄出。但是,第二天John的儿子Small John将这n封信都拿出了信封。不幸的是,Small John无法将拿出的信正确地装回信封中了。将Small John所提供的n封信依次编号为1,2,…,n;且n个信封也依次编号为1,2,…,n。假定Small John能提供一组信息:第i封信肯定不是装在信封j中。请编程帮助Sm原创 2017-05-14 18:48:03 · 516 阅读 · 0 评论 -
POJ 3020 Antenna Placement (最小边覆盖)
题目地址:点击打开链接题意:一个矩形中,有N个城市’*’,现在这n个城市都要覆盖无线,若放置一个基站,那么它至多可以覆盖相邻的两个城市。问至少放置多少个基站才能使得所有的城市都覆盖无线?无向二分图的最小路径覆盖 = 顶点数 – 最大二分匹配数/2思路:每两个相邻的星号连一条边,很明显这是一个最小覆盖的问题,但是在构图过程中,匹配是双向的,即 和都算匹配,因此匹配原创 2017-03-17 14:27:09 · 665 阅读 · 0 评论 -
qduoj 88 一道非常简单的炉石题(最大匹配)
题目地址:点击打开链接思路:如果凡神的卡能干掉对面的卡并且自己卡不死,那么这两张卡建立个关系,然后裸的匈牙利,看看最大匹配是不是n。代码:#include#include#include#includeusing namespace std;const int maxn = 105;vector g[maxn];int n, match[maxn],原创 2017-03-07 15:54:07 · 626 阅读 · 0 评论 -
HDU 5093 Battle ships (最大匹配)
题目地址:点击打开链接题意:给出一个n行m列的图,*代表海域,o代表冰水,#代表冰山,要想在海域中放置船,保证船与船之间不能相互看到,之间只要有山就不能看到,问最多能放多少船。思路:把每个横向“块”看做二部图中的X中的顶点,竖向“块”看做集合中Y的顶点,若两个“块”有公共的顶点海水,于是就连一条边。这样就转换成了没有公共顶点的最大边集,即最大匹配。#in原创 2017-03-18 17:05:50 · 418 阅读 · 0 评论 -
hdoj 1045 Fire Net (dfs or 匈牙利)
题意:给出一个图,其中有 . 和 X 两种,. 为通路,X表示墙,在.中放炸弹,然后炸弹不能穿过墙且不能互相炸到,问你最多在图中可以放多少个炸弹?思路:因为数据很弱,所以搜索也可以过。还有个更好的方法,二分图最大匹配。难在建图,把每一行中的可以放一个炸弹的一块区域标记为同一个数字,列也一样(行和列的标记数字不要有重复)。这样每个点就有一个行标记值和列标记值,然后按照这两个数字进原创 2017-02-18 13:49:53 · 465 阅读 · 0 评论 -
hdoj 1281 棋盘游戏 (匈牙利,关键位置)
思路:最多棋子数就是裸的匈牙利,关键位置数的话枚举删去每条关系,看看能放最多的棋子数是否减少,若减少则为关键位置,反之不是。代码:#includeusing namespace std;const int maxn = 105;vector e[maxn];int ca = 1, n, m, k, vis[maxn], match[maxn];bool Hungar原创 2017-02-18 15:11:00 · 429 阅读 · 0 评论 -
匈牙利算法(简单易懂)
matrix67(点击打开链接):说穿了,就是你从二分图中找出一条路径来,让路径的起点和终点都是还没有匹配过的点,并且路径经过的连线是一条没被匹配、一条已经匹配过,再下一条又没匹配这样交替地出现。找到这样的路径后,显然路径里没被匹配的连线比已经匹配了的连线多一条,于是修改匹配图,把路径里所有匹配过的连线去掉匹配关系,把没有匹配的连线变成匹配的,这样匹配数就比原来多1个。不断执行上述操作,直到找转载 2017-02-17 16:13:36 · 31061 阅读 · 5 评论 -
hdoj 2255 奔小康赚大钱 (KM算法 详解+模板)
转自点击打开链接【KM算法及其具体过程】(1)可行点标:每个点有一个标号,记lx[i]为X方点i的标号,ly[j]为Y方点j的标号。如果对于图中的任意边(i, j, W)都有lx[i]+ly[j]>=W,则这一组点标是可行的。特别地,对于lx[i]+ly[j]=W的边(i, j, W),称为可行边;(2)KM 算法的核心思想就是通过修改某些点的标号(但要满足点标始终是可行的),转载 2017-02-18 21:32:57 · 611 阅读 · 0 评论 -
hdoj 2819 Swap (最大匹配+输出路径)
题意:给你一个每位是0或1的矩阵,问你是否可以经过交换行和交换列使矩阵的对角线都为1,如果可以输出交换的方法。思路:行和列的匹配,左边是行,右边是列,然后如果行列交点是1,那么就可以匹配,看是否为完美匹配,然后输出怎么交换的。输出交换的路径:可以从第一列开始,每次找匹配行为该列号的(即如果该列为i, 找j使match[j] == i),然后这两列进行列交换就完成了这一列,一次完成接原创 2017-02-19 00:15:45 · 764 阅读 · 1 评论 -
poj 1325 Machine Schedule(最小点集覆盖)
题目地址:点击打开链接题意:A机器有n个模式,B机器有m个模式,有k个任务,第i个任务可以用A机器的ai模式或者B机器的bi模式,换模式需要重启,开始两个机器都在模式0,问最少需要重启几次。思路:要求最小的重启次数,也就是求出除了0模式,最少要工作在几个模式建图:A的模式为X集,B的模式为Y集,每个任务看做一条线,连接X集和Y集,则问题转化为求X、Y中最少的原创 2017-03-02 16:11:48 · 333 阅读 · 0 评论 -
hdu 4185 Oil Skimming (最大匹配)
题意:一块区域n*n,'#'表示油,'.'表示水,每次能挖1*2的矩形(横竖任意),且不能挖到水,而且不能交叉挖,问最多可以挖几下。思路:给每块油标号,相连的油建立关系,然后跑一下匈牙利,/2即为答案。代码:#include#include#include#includeusing namespace std;const int maxn = 1e3+原创 2017-02-23 17:01:22 · 561 阅读 · 0 评论 -
HDU 2389 Rain on your Parade(Hopcroft-Carp算法模板)
题目地址:点击打开链接题意:有n个人m把伞,在t秒后要下雨,给出每个人和伞的坐标和每个人走路的速度,问你在t秒内最多能有几个人能拿到伞(每把伞只能一个人用)。n,m匈牙利算法的时间复杂度是O(n*E),这题的边的数量达到了3000*3000,所以用匈牙利肯定会T,Hopcroft-Carp的时间复杂度是O(sqrt(n)*E).还没能理解Hopcroft原创 2017-03-17 15:22:21 · 591 阅读 · 0 评论 -
POJ 1466 Girls and Boys(最大独立集)
题目地址:点击打开链接题意:有n个学生,一些学生之间存在关系,现在要把学生弄到一个集合,这个集合中的学生两两不能有关系,求这个集合的最大学生数是多少。思路:将每个点拆成两个点,一个当作是男的点,一个当作是女的点了,然后连边。由于关系是相互的,这样就造成了边的重复。也就是边集是刚才的二倍,从而导致了最大匹配变成了二倍。那么答案就是最大独立集=顶点数-最大匹原创 2017-03-17 16:36:57 · 544 阅读 · 0 评论 -
hdu 3829 Cat VS Dog(最大独立集)
题目地址:点击打开链接题意:有p个孩子参观动物园,动物园里面有n只猫和m只狗,每个孩子喜欢猫讨厌狗,或者喜欢狗讨厌猫。只有把一个孩子不喜欢的动物移走,喜欢的动物留下,这个孩子才会高兴。 问最多能使多少个孩子高兴。思路: 一开始想着把猫和狗做二分图。。但不知道如何去建图了,而且高兴的孩子数也求不出。正解应该是把喜欢猫的和喜欢狗的分为两个集合作二分图,如果A喜欢B讨厌的原创 2017-03-08 23:47:56 · 569 阅读 · 0 评论 -
HDU 5556 Land of Farms(枚举 匈牙利)
题意:N*M的矩阵,'.'代表空地,'0-9'代表古代建筑,我们如果选择了一个编号的古代建筑想要建立,那么对应就要将该编号全部建筑建立起来,如果在空地上建筑,只建立当前点。问最多能够建立多少种建筑,并且每两种建筑之间没有公共边。思路:如果没有古代建筑,匈牙利就行,相邻的点建边,最后答案就是最大独立集=点数-匹配数(因为是双向边 所以/2).这题有古代建筑,但是建筑数最多才1原创 2017-09-27 23:21:08 · 394 阅读 · 0 评论