
图论-二分图匹配
文章平均质量分 81
围巾的ACM
啊啊什么时候也能成为一个大牛啊
展开
-
poj2594 Treasure Exploration(二分图)
思路:变形的最小路径覆盖,先用一次floyd求出每个点能去到的地方然后二分图匹配就好了#include#include#include#includeusing namespace std;const int maxn = 505;int n,m;int mp[maxn][maxn];struct Max_Match{ int n; vectorg[maxn];原创 2016-09-21 14:32:15 · 338 阅读 · 0 评论 -
HDU 3435 A new Graph Game(二分图最优匹配:有向环覆盖)
题意:给你一个N个节点M条边的无向图,要你求该图有1个或多个不相交有向环(哈密顿回路)构成时,所有这些有向环的最小权值.思路:和HDU1853差不多,这里是无向边改成插入两条有向边就行。这道题居然用网络流比二分图最优匹配快多了#include#include#include#define INF 1e9using namespace std;const int maxn=原创 2016-02-16 22:42:29 · 363 阅读 · 0 评论 -
HDU 2426 Interesting Housing Problem(二分图最优匹配)
题意:有N个学生和M个房间,每个学生可能会给多个房间打分.如果分数>=0,表示他可以选择这个房间.(如果分数 现在问你是否存在一个匹配使得每个学生分得一个单独的房间且每个房间最多1个学生.且这些房间都是学生打了分的且分数>0的房间? 如果存在输出分数和的最大值,如果不存在输出-1.思路:首先明显当输出N>M的时候直接输出-1.下面的情况就是N=0的房间.由于我们原创 2016-02-17 20:33:01 · 337 阅读 · 0 评论 -
HDU 3488 Tour(二分图最优匹配:有向环覆盖)
题意:给你一个N个顶点M条边的带权有向图,要你把该图分成1个或多个不相交的有向环.且所有定点都被有向环覆盖.问你该有向环所有权值的总和最小是多少?(保证有解)思路:参照HDU1853#include#include#include#define INF 1e9using namespace std;const int maxn=200+5;struct Max_Mat原创 2016-02-16 22:33:51 · 407 阅读 · 0 评论 -
HDU 1853 Cyclic Tour(二分图最优匹配:有向环覆盖)
题意:给你一个N个点M条边的带权有向图,现在要你求这样一个值:该有向图中的所有顶点正好被1个或多个不相交的有向环覆盖.这个值就是 所有这些有向环的权值和. 要求该值越小越好.思路:我们把任意一个顶点i都分成两个,即i和i’. 如果原图存在i->j的边,那么二分图有i->j’的边,费用小把权值取负#include#include#include#define INF原创 2016-02-16 22:30:44 · 259 阅读 · 0 评论 -
HDU 2119 Matrix(二分图最小边覆盖)
题意:给你一个N*M的0/1矩阵,你每次可以选特定的某行或某列,然后删除该行/列的所有1,问你最少需要几次操作能删除矩阵的所有1.思路:二分图简单题,前面好像有几道都与本题类似. 建图:把行号放在二分图左边点集,列号放在右边点集.如果(i,j)格子是1,那么就连左i与右j的无向边. 本题的问题就是求该二分图的最小边覆盖点集.使得每条边都被原创 2016-02-16 20:38:06 · 449 阅读 · 0 评论 -
HDU 3315 My Brute(二分图最优匹配)
题意:有S1到Sn这n个勇士要和X1到Xn这n个勇士决斗,初始时,Si的决斗对象是Xi. 如果Si赢了Xi,那么你将获得Vi分,否则你将获得-Vi分. Si和Xi对决时,Si有初始生命Hi,初始攻击Ai, Xi有初始生命Pi,初始攻击Bi. 且Si先出手,然后Xi失去Ai生命,之后如果Xi没死,那么Xi出手,Si失去Bi生命. 直到有一方的生命值 现在要你重新安排S和X的决斗顺原创 2016-02-16 20:24:42 · 412 阅读 · 0 评论 -
HDU 2853 Assignment(二分图最优匹配)
题意:给定一个二分图,N个点对应M个点,两两之间存在一组关系,每组关系一个权值。题目中了给定了一个匹配方案,现在要求满足这组关系中的最大的匹配权值在原方案上增长了多少?并且还要求出在原匹配方案上改变(最少)多少条边才能够得到这个最大匹配?思路:最优权值匹配很好求,直接用KM模板,但是要在原匹配边的基础上使得改变的边最少,这里需要特殊处理: 以下转自网上,写得很好。原创 2016-02-16 20:16:35 · 352 阅读 · 0 评论 -
HDU 1054 Strategic Game(二分图最小覆盖集)
题意:给你一颗具有N个节点的树的所有边信息.现在问你最少需要多少个点放到树的节点上,使得树的任意一条边都至少有一个端点被覆盖.(其实就是最小覆盖集)思路:明显的最小覆盖集. 且由于树天然就是二分的,所以我们只需要求该树的最小覆盖集点数即可. #include#include#includeusing namespace std;const int maxn=15原创 2016-02-15 22:00:28 · 275 阅读 · 0 评论 -
POJ1094 Sorting It All Out(拓扑排序)
题意:给你字母表的前N个大写字母和M个大小关系所有的边按顺序给你,要你在能判断出全序或矛盾的时候及时输出答案,或者直到最后也不能出现全序。思路:这道题卡在怎么在前K个已经能判断出全序了就输出,后来搜到了结论,如果能topo排序就说明没有矛盾,但是可能是全序或者偏序集.如果是全序集,那么topo排序的过程中,入度为0的点始终只会存在1个.#include #include #in原创 2016-02-02 20:25:25 · 270 阅读 · 0 评论 -
POJ 2195 Going Home(二分图最优匹配)
题意:给定一个N*M的地图,地图上有若干个man和house,且man与house的数量一致。man每移动一格需花费$1(即单位费用=单位距离),一间house只能入住一个man。现在要求所有的man都入住house,求最小费用。思路:之前用的网络流做的,现在用KM算法做。 每个人对应二分图左边的点,每个房间对应二分图右边的点.每个人与每个房间都有一条带权值的边,表原创 2016-02-15 20:31:54 · 391 阅读 · 0 评论 -
HDU 1528 Card Game Cheater(二分图最大匹配)
题意:Adam和Eve打牌,Eve可以看到Adam的牌.现在Adam已经把牌按顺序摆好了,Eve知道Adam所有的牌,所以Eve可以最优化自己牌的摆放顺序,使得自己每个位置上的牌赢Adam对应位置上的牌的个数最多. 其中每张牌由值+类型构成,值是2, 3, 4, 5, 6, 7, 8 ,9, T, J, Q, K, A,这些值依次增加其中2最小,A最大.类型为: C, D, S原创 2016-02-17 21:38:35 · 388 阅读 · 0 评论 -
POJ 2446 Chessboard(二分图最大匹配)
题意:给出一个矩形N*M棋盘,有K个格子是空洞,然后用2*1的矩形,对所有非空洞的格子进行覆盖,如果可以全部覆盖,就输出YES;思路:和HDU1507差不多,而且还简单点不用输出组合,见代码#include#include#includeusing namespace std;const int maxn=1000+5;struct Max_Match{ in原创 2016-02-18 15:27:41 · 354 阅读 · 0 评论 -
HDU 1498 50 years, 50 colors(二分图最小覆盖数)
题意:给你一个n*n的矩阵,在矩阵中分布着s种颜色的气球,给你k次扎破气球的操作,每次操作可以扎破一行,或一列的同一颜色的气球。问在k次操作后有那几种颜色的气球是不能被完全扎破的.思路:只需要对于每种颜色判断一下该颜色的气球最少需要多少次才能全部扎破即可. 假设当前处理颜色为1的气球(注意气球颜色最多有50种). 我们把行标号放左点集,列标号放右点集合. 如果(i,原创 2016-02-18 14:35:10 · 443 阅读 · 0 评论 -
HDU 3861 The King’s Problem(tarjan+二分图匹配)
思路:首先同属一个州就证明两个城市是强连通的,又要使得对于每一个州里的任何两个城市u、v,都有不经过其他州的路从u到v或从v到u,其实就是一个二分图#includeusing namespace std;const int maxn = 5000+50;int in0[maxn],out0[maxn];vectore[maxn];int pre[maxn],lowlink[m原创 2016-08-16 23:59:10 · 380 阅读 · 0 评论 -
hdu5727 Necklace(二分图)
思路:枚举阴球的全排列,然后如果和阳球不冲突的话就在这个位置和阳球连一条边,求二分图最大匹配,最后n-最大匹配就是冲突的最小个数#include#include#includeusing namespace std;const int maxn=120+5;#define INF 999999int ans = 0;int vis[maxn],pos[maxn];int原创 2016-07-20 18:06:39 · 725 阅读 · 0 评论 -
Codeforces Round #360 (Div. 2) C NP-Hard Problem(二分图)
思路:判断一个图能否变为一个二分图,直接DFS就好了#includeusing namespace std;const int maxn = 100000+500;vectore[maxn];vectorans[2];int vis[maxn];int flag;int type[maxn];void dfs(int u,int fa,int ty){ a原创 2016-07-01 15:57:28 · 672 阅读 · 0 评论 -
CodeForces 665D Simple Subset
题意:给你n个数,你需要找到一个最大的子集,使得这个子集中的任何两个数加起来都是质数。思路:建边的话,跑dfs一波最大团#includeusing namespace std;const int maxn = 1005;int pri[2000005];bool flag[maxn], a[maxn][maxn];int ans, cnt[maxn], group原创 2016-04-23 00:00:52 · 425 阅读 · 0 评论 -
CodeForces 624C Graph and String(二分图染色)
题意:给你一个图,然后让你给这些图标号,问你有没有一个合法的标号,标号就只能标a,b,c。然后a会和ab连边,b和abc都连边,c和bc连边,有解就任意输出一个就好思路:我们首先把那种边集有n-1的点染成b,然后再随便选一个没有染成b的点当成a,然后和a连边的就是a,没有和a连边的就是c#include<bits/stdc++.h>using namespace std;int mp[520][原创 2016-04-15 20:59:15 · 597 阅读 · 0 评论 -
HDU 3395 Special Fish(二分图中最优匹配)
题意:有N条鱼(不分性别),每条鱼有一个价值vi.且给出一个N*N的矩阵,矩阵中(i,j)格为1表示,第i条鱼会攻击第j条鱼并产下卵.产卵的数量= vi XOR vj. 现在每条鱼只能被攻击1次(一条鱼只能攻击1次且被攻击1次),且每条鱼只会攻击它可能会攻击的所有鱼中的一条(哪些其他鱼它会攻击已经在N*N矩阵中给出).现在要你求这N条鱼产卵数目的最大值.思路:简单的建图然后二分最优匹配即可原创 2016-02-19 14:03:25 · 381 阅读 · 0 评论 -
HDU 2448 Mining Station on the Sea(Floyd+最优匹配)
题意:给你一个由N个港口和M个海上油田构成的连通无向图(给出了图中所有的边和权值),现在给你N个船所在的油田编号,问你让这N条船,每条都回到1个港口去(每个港口最多只能容纳一条船),问你这N条船行走的总距离最短是多少?思路:其实每条船回到任意一个港口去都有一个距离(用Floyd算法算出的最短距离). 建立二分图: 我们把二分图左边放N个港口,右边放N条船,如果第j条船到第i个港口的距离为x,那原创 2016-02-19 14:17:11 · 486 阅读 · 0 评论 -
HDU 3722 Card Game(二分图最优匹配)
题意:给出n个字符串,其中任意两个字符串(包括同一字符串)可以进行互相拼接起来,例如s1="abcd"……s2="dcab",表示将s1拼接在s2后面,所得的值就是将s1反转得"dcba",该字符串与s2同有的前缀为"dc",所以值就是2.现在求解在n个字符串给定的情况下,将这些字符串拼接成1个或多个不相交的环所得到的最大值.思路:建立二分图:左右点集都是1到n个数字,代表1到n的字符串编号.原创 2016-02-19 13:53:54 · 564 阅读 · 0 评论 -
HDU 3729 I'm Telling the Truth(二分图最大匹配)
题意:一位老师想问N位同学他们大学入学考试的成绩. 每位同学只告诉老师他在全省的排名区间,比如[5006,5008]. 最终老师发现有一些人在说谎,比如区间[5006,5008]中有4个同学都说自己排名在这个范围内,那肯定是不可能的.现在老师要你找出最多有多少个同学没有说谎,且输出字典序最大的同学序号结果.思路:二分图的左边点集和右边点集分别是什么? 左边点集是学生序号,右边点集是1到1000原创 2016-02-18 22:06:30 · 449 阅读 · 0 评论 -
POJ 2724 Purifying Machine(二分图最大匹配)
题意:给出m串长度为n的01串。有些串中可能包含*,这样的串可以表示两个串,*为1 和*为0。重复的算一种。现在我们需要消灭掉所有的01串,消灭方式有两种: 1:一次消灭一个串。 2:如果两个串的差别只有一位的话可以同时消灭这两个串。 问最少多少次操作可以消灭所有的01串思路:也就是给你一些不同的(判重之后原创 2016-02-18 20:02:40 · 406 阅读 · 0 评论 -
HDU 2255 奔小康赚大钱(二分图最优匹配:模板题)
思路:二分图最优匹配模板题#include#include#includeusing namespace std;const int maxn=300+10;struct Max_Match{ int n,W[maxn][maxn]; int Lx[maxn],Ly[maxn]; bool S[maxn],T[maxn]; int left原创 2016-02-15 17:09:03 · 326 阅读 · 0 评论 -
HDU 3991 Harry Potter and the Present II(Floyd+DAG最小路径覆盖)
题意:一幅图上有N个点,M条边,边的权值表示通过这条边所需要的时间。有Q个任务,每次任务以Ci,Ti的形式给出Ci表示城市编号,Ti表示任务需要在Ti这个时间点完成.现在你拥有一个人,问至少还需要几个人才能完成所有城市给定时间上的任务。每个人都可以在任何时间点出现在任何城市思路:和POJ3216一样的做法..#include#include#includeusing name原创 2016-02-15 16:39:36 · 305 阅读 · 0 评论 -
HDU 4160 Dolls(DAG最小路径覆盖)
题意:有N个木偶,木偶有3项指标,w,i,h. 如果第i个木偶的3项指标对应小于第j个木偶的3项指标,那么i木偶可以放到j木偶中. 且一个木偶里面只能直接的放一个别的木偶.问你这N个木偶最优嵌套的方案下,最多有几个木偶不能被任何木偶嵌套?思路:如果i木偶能放在j木偶中,那么连一条i->j的有向边. 那么最终我们能得到一个DAG图. 现在我们的问题是要在该DAG图中找最少的简单路径,这些路径没有原创 2016-02-15 15:48:59 · 383 阅读 · 0 评论 -
HDU 2444 The Accomodation of Students(二分图判定+最大匹配)
题意:给你N个学生与M对关系,每个关系形如(i,j),表示第i个学生与第j个学生相互认识. 现在要你将N个学生分成两组,每组中的任意两个学生都不相互认识.如果N个学生能分组的话,那么就将这N个学生放到尽量多的双人房中去.每个房间放2个相互认识的人.问你最多需要多少房间?思路:先判断是否二分图,然后和POJ1466同样的做法#include#include#inclu原创 2016-02-13 15:52:59 · 280 阅读 · 0 评论 -
POJ 1466 Girls and Boys(二分图最大独立集)
题意:在一群男女同学之间存在”浪漫关系”,且该关系只存在于男同学与女同学之间.现在给出你比如2号学生与4号学生有浪漫关系(但是没给出你到底2号是男同学还是4号是男同学).给出所有的关系,要你求出一个由学生构成的集合,该集合中任意两人都不存在”浪漫关系”.思路:如果把男同学放左边,女同学放右边,如果男i与女j存在关系,那么左i与右j之间就连一条无向边. 其实最终我们要求的就是该二分图的最大独立集原创 2016-02-13 15:31:14 · 298 阅读 · 0 评论 -
POJ 3041 Asteroids(最小覆盖数)
题意:有一个N*N的网格,该网格有K个障碍物.你有一把武器,每次你使用武器可以清楚该网格特定行或列的所有障碍.问你最少需要使用多少次武器能清除网格的所有障碍物?思路:把网格的行1到N看出左边点集的点,网格的列号看成右边点集的点. 如果(i,j)格有障碍,那么就在左边i点到右边j点之间连接一条边. 现在的问题是 我们要在新图中选择最少的点使得所有边都至少有一个端点被选中了.(原创 2016-02-13 14:01:55 · 288 阅读 · 0 评论 -
POJ 2536 Gopher II(二分图最大匹配)
题意:有n个地鼠和m个洞,有鹰飞来时,n个地鼠如果能在s秒从当前位置回到一个洞,就能不死,一个洞能容纳一个地鼠,它们的速度为v。求可能死的地鼠个数的最小值思路:如果一个地鼠能在s秒内到达一个特定的洞,那么就在它们之间两一条无向边. 我们所建立的图是一个二分图,左边是地鼠,右边是洞.那么可能死的地鼠个数 = n – 最大匹配数.#include#include#include原创 2016-02-13 13:46:21 · 284 阅读 · 0 评论 -
POJ 3692 Kindergarten(最大独立集)
题意:已知班级有g个女孩和b个男孩,所有女生之间都相互认识,所有男生之间也相互认识,给出m对关系表示哪个女孩与哪个男孩认识。现在要选择一些学生来组成一个团,使得里面所有人都认识,求此团最大人数。思路:任意两个同学之间要么认识,要么不认识.现在我们根据所有同学之间的不认识关系来建图.为什么呢?因为二分图匹配的时候左边和右边的点是独立的没有边的,如果我们按照同学间认识关系来建图,那么左边的点互相都原创 2016-02-13 12:06:15 · 330 阅读 · 0 评论 -
POJ 2239 Selecting Courses(二分图最大匹配)
题意:小明需要去选择课程,他是一个爱学习的人,所以想尽可能多的选择课程,学校里有n个课程,并且在学校规定,每周里的每天有12节课,那么一周就有7*12节课。如果几个课程都在那d天的那c节课上课,那么你需要选择其中的一个,而不能选择多个课程现在要求算出小明最多可以选择多少个课程上.思路:左边的点表示课程,右边的点表示7*12=84个时间段,那么显然就是二分图最大匹配问题#原创 2016-02-13 12:20:47 · 259 阅读 · 0 评论 -
POJ 1469 COURSES(二分图最大匹配)
题意:有P门课和N个学生,每门课可能有0个或多个学生选修想选.现在问你能不能找到一种选课方案,使得P门课每门课都正好只有1个学生选修,且任意两个选了课的学生所选的课都不同?思路:显然的二分图匹配,该图可以看成是左边有P个点,右边有N个点的二分图.又由于我们想使得课与学生连的边最多且每个学生只能连一门课,每门课也只能有一个学生连接(即每个学生或每门课最多只有一条边依附).所以这就是一个匹配问题且原创 2016-02-13 00:00:04 · 308 阅读 · 0 评论 -
POJ 1274 The Perfect Stall(二分图最大匹配)
思路:把奶牛看出二分图左边的点集,牛栏看成二分图右边的点集.那么本题就是求该图的最大匹配边数了.#include#include#includeusing namespace std;const int maxn=500+10;struct Max_Match{ int n,m; vector g[maxn]; bool vis[maxn];原创 2016-02-12 22:37:31 · 242 阅读 · 0 评论 -
HDU 2063 过山车(二分图最大匹配:简单题)
题意:中文题...思路:明显的二分图最大匹配问题.左边放女孩,右边放男孩.如果i女孩能与j男孩配对,那么左i与右j有一条无向边.出新图的最大匹配数即可...开始二分图匹配的坑了..#include#include#includeusing namespace std;const int maxn=500+10;struct Max_Match{原创 2016-02-12 22:06:53 · 293 阅读 · 0 评论 -
poj1308
题意:判断一个图是否为树思路:满足两个条件,只有一个根,非根节点入度只能为1#include #include #include #include #include using namespace std;const int maxn=10000;int father[maxn];//父节点int into[maxn];//入度int flag[maxn];//原创 2016-01-30 16:25:05 · 308 阅读 · 0 评论 -
POJ 2771 Guardian of Decency(二分图最大独立集)
题意:老师带学生出去旅游,但是担心学生会发生恋爱关系,所以带出去的学生至少要满足以下要求之中的一个: 1.身高相差40cm以上 2.同性 3.喜欢的音乐风格不同 4.喜欢的运动相同 问最多可以带出去多少学生?思路:显然的一个二分图匹配,左边为男同学,右原创 2016-02-13 18:11:16 · 447 阅读 · 0 评论 -
POJ 1325 Machine Schedule(最小覆盖数)
题意:题意杀。题目大意就是有两台机器A,B,分别由m和n种模式,初始时都在模式0,现在有k个工作,每一个工作都可以将A设置成模式i或将B设置成模式j,但每一次更换模式时机器不得不要重启,求完成所有工作的最小重启次数输入数据的第一行有三个数据,分别代表工作数,A/B的模式数,当输入0时结束程序,接下来多行,每行的开始代表工作的序号,和完成该工作需将A/B设置的模式数,输出一个整数,代表机器最小重启次原创 2016-02-13 21:25:18 · 336 阅读 · 0 评论 -
HDU 1281 棋盘游戏(二分图最大匹配:关键边)
题意:中文题思路:这里建图很巧妙,把左边的点集看成是棋盘的行,把右边的点集看成棋盘的列.如果某个格子(i,j)可行,那么就连左i到右j的边. 这个图的最大匹配边就是原来棋盘能放的最多的棋子(仔细想想,验证一下). 现在的问题是我们要找出有多少个关键的边,那么明显关键边肯定在我们之前算出来的匹配中找(否则它肯定不关键). 然后我们只需要把该棋盘点对应的边删除再求一次最原创 2016-02-14 11:08:23 · 381 阅读 · 0 评论