ACM-图论-二分图
暗金色
这个作者很懒,什么都没留下…
展开
-
LightOJ - 1222 Gift Packing(带权二分图)
题目大意:有n个礼物,n个箱子,礼物放到箱子里有相应的收益,一个箱子只能放一个礼物,问最大收益是多少解题思路:模版题#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXNODE = 510;typedef int Type;const Type INF = 0x3f3原创 2015-11-03 23:03:36 · 450 阅读 · 0 评论 -
LightOJ - 1206 Scheduling Taxi Cabs (二分图)
题目大意:给出N个行程,问能组成多少个DAG解题思路:两个点集,找出最大匹配数,然后用N - 最大匹配数,就是DAG的数量了#include <cstdio>#include <cstring>#include <cstdlib>const int N = 510;int n, cas = 1;int startTime[N], a[N], b[N], c[N], d[N], cost[N]原创 2015-11-03 22:46:02 · 553 阅读 · 0 评论 -
二分图小结
概念 最小点覆盖 = 最大匹配数最大独立集 = n - 最大匹配数模版 二分图最佳完美匹配-KM算法二分图匹配-Hungary算法二分图多重匹配题目 POJ - 1466 Girls and Boys 最大独立集POJ - 1719 Shooting Contest 最大匹配POJ - 2594 Treasure Exploration 建模POJ - 3041 Astero原创 2015-09-14 21:17:15 · 615 阅读 · 0 评论 -
POJ - 1325 Machine Schedule 二分图 最小点覆盖
题目大意:有两个机器,A机器有n种工作模式,B机器有m种工作模式,刚开始两个机器都是0模式,如果要切换模式的话,机器就必须的重启 有k个任务,每个任务都可以交给A机器的i模式或者B机器的j模式完成,问要重启多少次机器才能完成任务解题思路:两个机器的点分为两个点集,点集之间的关系就是任务了,要将所有任务都完成,就要将所有边都覆盖掉,所以就是求最小点覆盖了。 这里有一个点要注意,如果所有任务中都有一原创 2015-06-11 09:58:33 · 709 阅读 · 0 评论 -
二分图匹配Hungary算法
算法讲得挺形象的详细解说#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1010;vector<int> g[N];//link表示第i个结点的匹配点int link[N];int n;bool vis[N];bool转载 2015-09-13 23:07:41 · 489 阅读 · 0 评论 -
二分图多重匹配
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>using namespace std;const int N = 1010;vector<int> g[N];//vlink记录的是每个结点已经匹配了多少个点了//link记录的是第i个结点的第j个匹配点是什么//cap是每个结点的最大匹转载 2015-09-13 23:11:42 · 610 阅读 · 0 评论 -
POJ - 2594 Treasure Exploration 二分图匹配 + floyd
题目大意:在火星上有N个矿,有点矿之间存在着一条路,由于在火星比较特殊,该路变成了单向路,且机器人只能出现在这条路的两个端点,问最少需要派多少机器人,才能探清这些矿解题思路:路可以拼接起来形成一条新的路,所以在所给的条件下还可以再扩展,用floyd将所有能连通的点找出来 接下来就是二分匹配的过程了,求出最大匹配数,在用n-最大匹配数就是答案了#include<cstdio>#include<cs原创 2015-06-06 21:05:25 · 852 阅读 · 0 评论 -
POJ - 2446 Chessboard 二分图 最大匹配(输入坑)
题目大意:有一个n*m的棋盘,棋盘上面有k个洞。 现在要求你在这棋盘上面放1*2的矩形,使得棋盘上除k个洞之外的所有点都被1 * 2的矩形覆盖,且只覆盖一次解题思路:思路不难想到,将每一点作为两个点集(除洞之外),点集之间的联系表示该点能联通的点,这样二分图就构造完成了 只需要求出最大匹配数,再和n * m -k比较即可 输入是个坑啊,输入的坐标是(x,y),但是表示的缺失y行,x列#incl原创 2015-06-10 00:52:01 · 875 阅读 · 0 评论 -
POJ - 1719 Shooting Contest 二分图最大匹配
题目大意:由一个r * c的矩形,每列有两个格子是白色的,其他的格子都是黑色的。 你有一把枪,枪里面有c发子弹,现在要求你一列一列的打中白色的格子,使得所有行的白色格子至少有一个被打中解题思路: 将列归为一个点集,行归为另一个点集进行匹配 写法1:将列标记为1 – c,行标记为1+c – c + r,这样就可以进行匹配了,但这样的复杂度比较大。。。#include<cstdio>#inclu原创 2015-06-06 17:31:52 · 604 阅读 · 0 评论 -
POJ - 1486 Sorting Slides 二分图 完美匹配
题目大意:给出n张透明的矩形纸张散乱在桌上,每张纸张上面都有一个数字。 现在给出每个矩形的左下角和右上角坐标和每个数字所在的位置,问能否找出每个矩形的唯一对应数字解题思路:分析该题可得到,二分图匹配的结果肯定是完美匹配,匹配的结果肯定为n。 接着就要判断每个点是否唯一匹配了 判断能否唯一匹配,就要在完美匹配的情况下,删除该点的那条匹配,如果还能再找出一个完美匹配,那么该点就不是唯一表示的了#i原创 2015-06-09 15:24:35 · 1189 阅读 · 0 评论 -
LightOJ - 1209 Strange Voting(二分图)
题目大意:有N个男的,M个女的,V张投票。每张票的形式要么是Mi Fj,要么是Fi Mj(Mi表示第i个男的,Fi表示第i个女的),第一个出现的表示选取,第二个表示淘汰 问最多能有几张票不存在冲突解题思路:票分为两个点集,如果冲突了,就连边 最后的答案就是最大独立集了,最大独立集内的所有票都满足条件#include <cstdio>#include <cstring>const int N原创 2015-11-03 22:51:21 · 457 阅读 · 0 评论 -
UVA - 1459 Flowers Placement(二分图+dfs)
题目大意:给出M行N列的花的摆放形式,要求每行每列的任意的两种花的编号不同。现在问,如果新添加一行,如何添加,输入第k个字典序的摆放解题思路:找出每列可以放的花的编号,连边,接着跑一下二分图匹配,看能否完美匹配,如果不能的话,表示无法摆放 跑这个二分图匹配不是白跑的,后面用得上 因为要第k个字典序,所以要枚举每一列所能摆放的花。 这里需要一个剪枝,如果当前枚举的列为第j列,往后的j+1到第N列原创 2015-08-24 00:04:15 · 1204 阅读 · 0 评论 -
二分图最佳匹配---KM算法
O(n^4)算法#include <cstdio>#include <cstring>#include <algorithm>using namespace std;#define N 510struct Kuhn_Munkres{ int n, left[N], Lx[N], Ly[N], w[N][N]; bool S[N], T[N]; void update()转载 2015-11-02 13:31:16 · 823 阅读 · 0 评论 -
LightOJ - 1152 Hiding Gold(二分图匹配)
题目大意:有一张地图,地图上面有黄金,现在要求你用最少的1*2或者2*1的布条将这些黄金覆盖解题思路:黄金分两个集合,能共用同一条布条的黄金连边,接着求出最大匹配数,最大匹配数/2就是共用一块布条的黄金了,所以最后的答案就是黄金数量 -最大匹配数#include <cstdio>#include <cstring>const int N = 25;int gold[N * N], g[N*N]原创 2015-11-02 22:48:31 · 691 阅读 · 0 评论 -
LightOJ - 1149 Factors and Multiples(二分图匹配)
题目大意:给你两个集合,要求你从两个集合中剔除K个数,使得集合B的任意数i,在集合A中,不存在i = j * k(k为整数),且剔除掉的数要的和要达到最小,问最小的K解题思路:剔除掉的数的和要最小,其实是没什么卵用的,在K最小的情况下,已经存在最小的情况了,要不然,K就要比最小值大先处理出B集合中能被A整除的,连边,接着进行二分图匹配,要剔除的数就是二分图的最小点覆盖了#include <cstdi原创 2015-11-02 22:34:56 · 455 阅读 · 0 评论 -
LightOJ - 1150 Ghosts!(二分图+bfs+枚举)
题目大意:给你一张map,map上面的”G”表示鬼,“H“表示人,“.“表示空地,”#”表示障碍 地图上只有鬼能移动,移动一步需要花费1个单位时间。鬼要吓人(一只鬼只能吓一个人),吓人的时候需要2个单位时间,吓人的条件是,要和人所在的位置相同, 这些鬼的目的是吓到所有的人,且在吓人后返回原地。因为快要黎明了,鬼不能花太多的时间,所以要求吓到所有人且返回原地的时间达到最小解题思路:人和鬼分开,成两原创 2015-11-02 22:44:17 · 496 阅读 · 0 评论 -
HDU - 3081 Marriage Match II(二分图最大匹配 + 并查集)
题目大意:有n个男生n个女生,现在要求将所有的男女配对,所有的男女都配对的话,算该轮游戏结束了。接着另一轮游戏开始,还是男女配对,但是配对的男女不能是之前配对过的。 问这游戏能玩多少轮 男女能配对的条件如下 1.男女未曾吵架过。 2.如果两个女的是朋友,那么另一个女的男朋友可以和该女的配对解题思路:并查集解决朋友之间的关系,找到能配对的所有情况 接着二分图匹配,找到一个完美匹配算玩了一轮游原创 2015-08-04 14:02:49 · 716 阅读 · 0 评论 -
LightOJ - 1198 Karate Competition(带权二分图)
题目大意:你有一个队伍,对手也有一个队伍,每个队伍里面有N个人,每个人有相应的能力值。现在要求进行N场比赛,每个人只能参加一次,如果赢一场的话,得2分,平局得1分,输了得0分,问最多能赢多少分解题思路:模版题了#include <cstdio>#include <cstring>#include <algorithm>using namespace std;const int MAXNODE原创 2015-11-03 23:01:33 · 451 阅读 · 0 评论 -
LightOJ - 1403 Air Raid(二分图)
题目大意:求DAG的数量解题思路:DAG的数量,就是最大独立集的数量#include <cstdio>#include <cstring>#include <vector>using namespace std;const int N = 1010;vector<int> G[N];int left[N];int n, m, cas = 1;bool vis[N];void init原创 2015-11-03 22:57:29 · 433 阅读 · 0 评论 -
LightOJ - 1429 Assassin`s Creed (II)(二分图)
题目大意:给你一张有向图,问这张有向图有多少个DAG解题思路:因为会存在环,所以得先缩点 缩点完后,就可以进行二分图匹配了,DAG的数量就是最大独立集的数量了 这题卡了邻接表#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>using namespace std原创 2015-11-03 22:53:45 · 426 阅读 · 0 评论 -
LightOJ - 1184 Marriage Media(二分图匹配)
题目大意:给你N个男的,M个女的,要求你尽量的配对 两个人配对的话要满足以下条件: 1.异性 2.身高差不超12 3.年龄差不超5 4.婚姻状态相同解题思路:二分图最大匹配,处理好边就好了#include <cstdio>#include <cstring>#include <cstdlib>const int N = 55;const int M = 110;int n, m,原创 2015-11-03 22:44:01 · 435 阅读 · 0 评论 -
POJ - 3020 Antenna Placement 二分图 最小路径覆盖
题目大意:有n个城市,要在这n个城市上建立无线电站,每个无线电站只能覆盖2个相邻的城市,问至少需要建多少个无线电站解题思路:英语题目好坑,看了半天。。 这题和POJ - 2446 Chessboard类似 可以将所有城市分成两个点集,那么之间的连线就代表无线电站的覆盖关系了。 因为所有城市都要覆盖到,所以根据关系,求出最小路径覆盖就能覆盖所有城市了#include<cstdio>#inclu原创 2015-06-10 09:29:53 · 1104 阅读 · 0 评论 -
POJ - 1548 Robots 二分图 最小路径覆盖
题目大意:在一个n * m的地图上面有k个垃圾,问需要派几个机器人才能全部捡完。 机器人的行走路线已经被规划好了,只能从左上向右下走,且只能前进,不能倒退解题思路:将所有点分成两个点集,点集之间的关系就是能否从该点走到另外一点,如果可以的话,那么关系就存在了#include<cstdio>#include<cstring>#include<vector>using namespace std原创 2015-06-11 09:12:13 · 649 阅读 · 0 评论 -
POJ - 2724 Purifying Machine 二分图 最大匹配
题目大意:看了别人的题意: 给出m串长度为n的01串,如果某个串中包含‘*‘号的,那么这个串就可以变成两个串(因为‘*‘既可以表示0或者1) 比如字符串*01就可以表示成001,或者101 现在的任务是消除所有的串,给出消除串的规则如下: 1一次消灭一个串。 2如果两个串的差别只有一位的话可以同时消灭这两个串。 问至少需要多少次才能消灭这些串解题思路:先将这些串去重,化成整数,这样就可以原创 2015-06-10 13:53:21 · 816 阅读 · 1 评论 -
UVALive - 4288 Cat vs. Dog(最大独立集)
题目大意:给出N个人的投票,每个人投票形式为以下两种的其中一种 1.喜欢的狗的编号,讨厌的猫的编号 2.喜欢的猫的编号,讨厌的狗的编号 问如何选择猫狗,才能满足最多的人的投票解题思路:找出每个喜欢猫的人和喜欢狗的人,然后分成两个点集 如果喜欢的猫和对方讨厌的猫相同,或者讨厌的狗和对方喜欢的狗相同,那么就表示这两个人的愿望是无法同时满足的了,那么连线 接下来,最大独立集就是那些人的愿望都能满原创 2015-08-23 23:57:37 · 922 阅读 · 0 评论 -
UVA - 10615 Rooks(二分图匹配 + 枚举)
题目大意:给出一个N*N的棋盘,上面放了一些车。现在要用尽量少的颜色对这些车进行染色,使得同一行同一列的任意两个车的颜色不同解题思路:首先,先统计一下需要染多少种颜色。 需要染多少种颜色,是由一行或者一列的车的最大数量决定的。 接着枚举一下每种颜色(假设颜色为k种),再决定哪些地方需要染哪些颜色,决定哪些地方染哪些颜色,这就由二分图匹配来决定了首先,先建立这个二分图。如何建立这个二分图呢,将所有原创 2015-08-23 23:52:27 · 872 阅读 · 0 评论 -
POJ - 1466 Girls and Boys 二分图+最大独立集
题目大意:有n个学生,某些学生之间存在着一种特殊的关系。。。现在要找出m个学生,要求这m个学生之间的任意两人不存在这种特殊的关系解题思路:二分图问题,因为没办法划分成相应的两个集合且特殊关系是对称的,所以可以将两个点集都设置为n个点,求出最大匹配后再除以2即可得到(因为关系是对称的,所以所求得的最大匹配是双倍的) 得到最大匹配了,可以由定理得到 最大独立集 = n - 最大匹配数#include<原创 2015-06-06 16:00:23 · 833 阅读 · 0 评论 -
POJ - 2771 Guardian of Decency 二分图 最大匹配数
题目大意:有n个人要参加一项活动,活动要求参加的人里面尽量不要有couples,主办方提出了四个降低couples的方法: 1.两个人的身高差大于40 2.性别相同 3.喜欢的音乐风格不同 4.喜欢的运动相同 只要满足其中的一项就认定两人不是couples 现在给出n个人的四项数据,问最多能邀请到多少人解题思路:这题和Poj 1466 Girls and Boys这题很相似,只不过这题给原创 2015-06-09 13:18:52 · 733 阅读 · 0 评论 -
POJ - 3216 Repairing Company 二分图 最小路径覆盖
题目大意:有一个人开了一间维修店。某天,该维修店接收到了Q个任务,这Q个任务分布在M个城市中。每个任务有三个值,分别是所在城市,起始时间,维修时间。 现在给出M个城市的路线图,路线对应的是从某城市到某城市的所需时间。 问至少要派多少个维修人员才能完成这Q个任务解题思路:现将能联通的城市联通起来,用floyd求出城市之间的时间数 接着就要找关系了,如果起始时间 + 维修时间 + 两个城市来往的时原创 2015-06-09 00:40:03 · 723 阅读 · 0 评论 -
POJ - 2239 Selecting Courses 二分图 最大匹配
题目大意:有n种课程,给出n种课的分布,问一个人最多可以选择多少种课(重复的不算)解题思路:将课和分布情况分成两个点集,课在左边,然后求出最大匹配数就可以了#include<cstdio>#include<cstring>#include<vector>using namespace std;const int N = 310;vector<int> Class[N];int n, li原创 2015-06-08 19:43:23 · 544 阅读 · 0 评论 -
POJ - 2536 Gopher II 二分图 最大匹配
题目大意:有n只老鼠,m个洞,一个洞只能藏一只老鼠。 有一群鹰来了,老鼠们要赶紧躲到洞里才不会被抓走。 现在给出每只老鼠的坐标,每个洞的坐标,老鼠的速度,和鹰捉到老鼠的时间,问鹰最少能抓到几只老鼠解题思路:求出每只老鼠和每个洞之间的距离,然后除于老鼠的速度,看在鹰捉到老鼠的时间内能否跑到该洞中。 然后将老鼠和洞分成两个点集,进行二分图的最大匹配,然后n-最大匹配就是鹰至少能抓到的老鼠的数量了#原创 2015-06-08 14:16:52 · 757 阅读 · 0 评论 -
POJ - 3041 Asteroids 二分图 最小点覆盖
题目大意:在一个N * N的网格中,有M个障碍物,现在你有一把武器,这个武器可以消除任意一行或者一列的障碍物,现在要求将所有障碍物消完,问至少使用这把武器多少次解题思路:想了老半天怎么解决行和列的问题。。。怎么表示两个点集 最后突然想到,既然不知道怎么处理行列,就将行列分别分成两个点集吧,点就代表行和列之间的关系,就这样交了一发,A了。 其实,这确实是,行列之间的连线(点)只要能用某些点表示就可原创 2015-06-07 19:31:29 · 594 阅读 · 0 评论 -
POJ - 3692 Kindergarten 二分图 最大匹配
题目大意:给出n个男生,m个女生,还有k对男女认识关系,性别相同的人都相互认识。现在要求你挑出k个人,使得这k个人两两之间都相互认识解题思路:要挑都认识的人,可以排除掉不认识的人。 可以分成两个点集,一个点集是男,一个点集是女,两个点集的连线表示两个人互不相认识,所以只要找到最大的互不相认识的匹配数,再用 n + m -互不相认识的匹配数,得到的人就是都相互认识的人了#include<cstdio原创 2015-06-09 21:53:57 · 799 阅读 · 0 评论 -
UVALive - 3353 Optimal Bus Route Design(二分图最佳匹配)
题目大意:给出一个n个点的有向带权图,找若干个圈,使得每个节点恰好属于一个圈,要求总长度尽量小解题思路:首先要在一个圈内,且只能在一个圈内,那么每个点的入度和出度要都为1,所以二分图就有了 接着连边,给出来的边都连了,没给的边就设为INF,最后求最小权和就可以来 如果最小权和大于INF了,就表示无法满足每个点都在一个圈内的要求了 注意:会有重边#include <cstdio>#includ原创 2015-08-24 00:10:00 · 1386 阅读 · 0 评论 -
POJ - 1422 Air Raid 二分图最大匹配
题目大意:有n个点,m条单向线段。现在问要从几个点出发才能遍历到所有的点解题思路:二分图最大匹配,只要一条匹配,就表示两个点联通,两个点联通只需要选取其中一个点即可,所以有多少条匹配,就可以减去多少个点#include<cstdio>#include<cstring>using namespace std;const int N = 130;int g[N][N], vis[N], link原创 2015-06-07 23:03:05 · 809 阅读 · 0 评论 -
POJ - 2060 Taxi Cab Scheme 二分图 最小路径覆盖
题目大意:有n项任务,给出每项任务的出发时间,出发地点和目的地。 当一个任务完成之后,如果 当前时间 + 到达另一个任务的出发地的时间 <= 另一个任务的出发时间 - 1 的话,那么就可以让这个人接下去完成这个任务了 问至少需要派多少人才可以完成任务解题思路:这题和 poj-3216 Repairing Company很像 两个点集都是任务,如果一个任务完成了可以接下来完成另一个任务的话,那么原创 2015-06-11 13:21:09 · 695 阅读 · 0 评论 -
POJ 3189 Steady Cow Assignment(二分+多重匹配)
题目大意:有B间笼舍(每间笼舍能容纳Ci头牛),N头牛,给出每头牛对笼舍的好感,现在要求你将这些牛安排到这些笼舍里,使得对笼舍好感度最高的和对笼舍好感对最低的值达到最小解题思路:二分枚举值,然后多重匹配#include <cstdio>#include <cstring>using namespace std;const int N = 1020;const int B = 30;int原创 2015-09-05 16:21:50 · 403 阅读 · 0 评论 -
POJ - 1698 Alice's Chance (二分图多重匹配)
题目大意:有一个人,想看N场表演,每场表演需要看K次 现在给出每场表演的周安排,和表演的截止日期 问这个人能否看完所有电影解题思路:二分图多重匹配可以做,最大流也可以做,这里只讲二分图最大匹配 讲350天设置成一个点集,将每场表演设置为另一个点集,容量为需要看的次数,两者间的关系就是该天是否有表演#include <cstdio>#include <cstring>#include <al原创 2015-08-05 12:54:02 · 599 阅读 · 0 评论 -
HDU - 3861 The King’s Problem(强连通分量+最小路径覆盖)
题目大意:给出一张有向图,要求你将这些点进行划分,划分依据如下 1.如果两个点互相可达,那么这两个点必须在一个集合中 2.同一个集合中任意两个点u,v要满足,要么u能到达v,要么v能到达u 3.一个点只能被划分到一个集合问最少能划分成几个点集解题思路:首先先求出所有的强连通分量,满足条件1 满足条件2,3的话,就要求出最小路径覆盖 所以可以将所有的强连通分量进行缩点,桥作为连接,然后匈牙利原创 2015-08-15 00:16:59 · 1196 阅读 · 0 评论 -
UVALive - 4043 Ants (KM裸题)
题目大意:给出N只蚂蚁和N棵树的坐标,问如何完美匹配,才能使蚂蚁到树的连线不会相交解题思路:KM裸题,但是很郁闷啊 不开根号,用long long竟然过不了,很无语啊,距离最大只有8亿啊 然后用A的double的代码,把他改成了long long ,WA了 然后再用double的A的代码,不开根了,又WA了,这题真坑到底是什么鬼#include <cstdio>#include <cstri原创 2015-08-06 17:48:02 · 1022 阅读 · 0 评论