网络流 二分图匹配
文章平均质量分 73
zxy_snow
这个作者很懒,什么都没留下…
展开
-
hdu 2444 The Accomodation of Students
判断是不是二分图,如果是的话输出最大匹配数。判断用二分图染色,DFS下就好。#include #include #include #include #include #include #include #include #include #inclu原创 2011-08-26 12:28:48 · 1003 阅读 · 0 评论 -
zoj 2192 || poj 2584 T-Shirt Gumbo
给你衣服每个号的数目,以及每个人要穿哪种型号的衣服,求是否所有的参赛队员都能穿到合适的衣服。最大二分匹配哈,建图,每个衣服数都拆成1,把每个人能穿的衣服都连条边,求最大二分匹配即可。这个建图虽然繁不过不难。。。一个变量写错导致SF一次。。匈牙利算法我木有看以前写的,哈哈。。好顺。。#include #include #include #include #include #include #include #include #include #define MAX 120原创 2011-03-10 18:44:00 · 1410 阅读 · 1 评论 -
zoj 1992 || poj 1637 Sightseeing Tour
混合图的欧拉回路。以前没遇到过这种题,纠结啊。。。搜了下,发现是需要用最大流解的,隐约记得黑书上最大流有讲这个的,就去翻黑书了。黑书提供了两种算法,第一种自己模拟了下,觉得有点看不懂,觉得它书有的地方没说清楚,而且我自己模拟的结果不对 = =。。。第二种算法是网上大家经常用的,理解了下。大致就是,先将无向边定向,就是比如13,可以定它的方向为1->3,1的出度++,3的入度++即可。读入的时候如果遇到无向边,把这条边加入待建的网络中,流量为1。读入完后,然后用出度减入度得到x,如果x为奇数,肯定不存在欧拉回原创 2011-03-07 22:02:00 · 1861 阅读 · 2 评论 -
SCU 2011 warmup contest 4 —— A B C I
<br />http://cs.scu.edu.cn/soj/contest/contest.action?cid=262<br /> <br />A题,给你一个无向图,求没有连接到1的点的个数。可以用并查集或者从1出发DFS也行,10分钟1A,嘻嘻。<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>原创 2011-03-05 21:43:00 · 783 阅读 · 0 评论 -
poj 1295 Going Home
<br />这题以前拿最小费用最大流做过,KM 直接套模板了。。。恩。。。我还需要理解。。。<br /> <br />#include <cstdio>#include <cstdlib>#include <iostream>#include <string.h>#include <queue>#include <math.h>#include <limits.h>#define MAX 210using namespace std;typedef struct HOUS原创 2011-03-03 20:57:00 · 1053 阅读 · 2 评论 -
zoj 2314 Reactor Cooling
好郁闷。最大流。但是没见过这种类型的,想了种方法,但是答案不对 = =。。。搜了下,这个是另一种类型,无汇源的有上下界的最大流。引用http://blog.imzzl.com/2010/07/630.html的一段话总的来说就是新建一个原点汇点 s,t,对原来的每个点i,设m(i)=sum{b}-sum{b}其中b为流量下界,若m(i)>0,连一条容量为m(i)的边;若m(i)容量为|m(i)|的边。然后将原来边的容量变为c-b。求一次最大流。如果与s和t关联的边全部满流,则可行流存在,且每条边的流量为现在原创 2011-02-14 21:07:00 · 1754 阅读 · 0 评论 -
zoj 1734 || poj 1459 Power Network
题目太恶心了。描述那么多都是鸡肋 = =。。多源点多汇点。给出道路连接的最大容量,给出源点容量和汇点容量,求最大流而已 = =。。。这题目太恶心了,太恶心了。看了半天才看懂。本来想用dinic的,找的非递归的模板有问题 = =。。。递归的dinic都比EK快一倍。。理解着真的好难啊。。。EK #include #include #include #include #include #include #define MAX 120using namespace std;int原创 2011-02-09 17:00:00 · 1630 阅读 · 0 评论 -
poj 3469 Dual Core CPU
<br /> <br />建图,源点为A核,汇点为B核,每个顶点有A-> i -> B的两条边。<br /> <br />如果两个顶点不是同一个核需要代价,这两个点建立两条有向边。<br /> <br />相当于求最小割,呃,就是求最大流了 = =。。。刚想明白。。。最小割就是最大流啊。。。<br /> <br />我的dinic模板TLE了 = =。。<br /> <br />搜的一个模板4000+MS过了 = =。。。<br /> <br />哎。。又要好好理解咧。。。<br /> <br />#inc原创 2011-02-10 22:17:00 · 1535 阅读 · 0 评论 -
关于最大流 Dinic 算法的一些理解。
小媛原创啊,哇咔咔~~1、剩余图,简单来说即边的容量为总容量 - 当前流量。2、层次图,即从源点开始,生成的一颗BFS树,可以这么理解,树的高度 - 当前树的高度即为层次编号。由此可知,层次图的构建需要用BFS去找,相当于BFS的时间戳了都。而dinic的BFS函数是判断汇点是否在从源点开始找的层次图里。我觉得dinic与EK的区别之处在于,EK是用BFS去找增广路,而dinic是在层次图里用DFS找增广路。引用下http://acm.hrbeu.edu.cn/forums/index.php?showto原创 2011-02-10 11:22:00 · 3695 阅读 · 1 评论 -
poj 1698 Alice's Chance
<br />这个是多重匹配啊??? = =。。。无语了。。<br /> <br />可以用最大流做,把电影当成源点,输出电影天数的流,每一天连接流量为1作为汇点,然后就是多汇源的问题了。。最后看汇点流量是否等于源点流量即可。<br /> <br />我用匹配做的,直接把电影按需要的天数拆点,然后点与可以拍摄的日期连线,求最大匹配即可。判断最大匹配是否等于总共需要的天数即可。<br /> <br />电影拆点后最多可达到 20*50个点。。所以数组不要开小了。。<br /> <br />#include <q原创 2011-03-12 10:37:00 · 1491 阅读 · 0 评论 -
UVa 11045 My T-shirt suits me
第二道UVA的题目,1A,嘻嘻。类似之前做的那个衣服分配问题,不过这个比那个还简单了。每个人只有两种衣服适合,而且每种衣服的数量是相等的。建图很随意哈,把每种衣服拆成一件一件的,然后跟队员连线求最大二分匹配即可。#include #include #include #define MAX 650using namespace std;int map[MAX][MAX];int used[MAX],mat[MAX];char Size[7][5] = {"","XXL","XL",原创 2011-03-14 18:14:00 · 1822 阅读 · 0 评论 -
poj 2446 Chessboard
<br />这个这个 = =。。。数组开小,WA了数次。。。本来32*32,我开了1000,居然不够 = =。。。<br /> <br />把没有洞洞的块块编号,直接可以用一块板子盖的相邻的两个块块相连。。然后求最大二分匹配,求得的数/2 (因为建图建了两次边,1->2 2->1)看是否等于需要的块即可。。<br /> <br />#include <stdlib.h>#include <stdio.h>#include <string.h>#include <iostream>#def原创 2011-03-14 22:26:00 · 1797 阅读 · 0 评论 -
hdu 2448 Mining Station on the Sea
最小费用最大流。多源多汇点,把源点S 到 每个船所在的station建一条容量为1,cost为0的单向边。把每个port到 汇点T 建一条容量为1,cost为1的但单向边。注意station之间的边的容量要建为inf。。而且port 和 station之间是单向边原创 2011-08-24 23:44:28 · 1205 阅读 · 0 评论 -
zoj 2760 How Many Shortest Path
好早以前就见了,一直也没做。昨天才做过一个类似的,今天不想做题。。。看会升刚过这个。。。就把这个A了算了。给出邻接矩阵,求从S到T有多少条不相重叠的最短路。太坑了,输入的矩阵对角线不一定都是0 = =。。。WA死我了建图直接和上题一样,不多说了。#incl原创 2011-09-08 16:40:46 · 1783 阅读 · 1 评论 -
sgu 185 Two shortest
求两条最短路,输出路径。直接先跑一遍最短路,然后按照 dis[i] + a[i][k] == dis[k] 建立网络流的边,容量为1。然后跑一遍汇点容量为2的最大流。也就是求得了两条路。然后从原点DFS正向边,DFS一条路径后删掉这条路径,DFS2次,就求得了两条这样原创 2011-09-07 21:35:35 · 1577 阅读 · 0 评论 -
hdu 3991 Harry Potter and the Present II
根据每个需要送礼物的点建图,最小路径覆盖。发现我居然没匈牙利的邻接表的模板,有数组模拟邻接表的,用着灰常不好用。。。写了个邻接表的,还是用邻接表爽啊。。#include #include #include #include #include原创 2011-09-01 20:51:59 · 1140 阅读 · 0 评论 -
hdu 3987 Harry Potter and the Forbidden Forest
求最小割集的最少边数。很神的方法 http://hi.baidu.com/mengyun1993/blog/item/c30d193c9a85932870cf6cda.html用的党的模板。#include #include #include #include原创 2011-08-31 22:28:57 · 1439 阅读 · 0 评论 -
hdu 3861 The King’s Problem
求单侧连通分量的最小个数。求强连通分量后,在缩点后的图上用二分图匹配找最小路径覆盖即可。党写的缩点建图,我的匈牙利。。。#include #include #include #include #include using namespace std;const in原创 2011-07-20 19:10:35 · 1689 阅读 · 0 评论 -
hdu 3829 Cat VS Dog
这题刚上来就看的这题,用模拟写啊写,又用贪心写啊写。。。我抽象成图了,然后删掉出度最多的(也就被最讨厌的人最多的),然后这么删,WA了,又改成删掉被喜欢最少的,还是WA。。。怎么YY都不行 T T 。。。然后就去看其他题了。瞟见群里说这题是二分匹配= =。。。二分匹配。。。怎么也原创 2011-07-13 21:04:13 · 1560 阅读 · 4 评论 -
poj 2594 Treasure Exploration
<br />最小路径覆盖<br /> <br />和1422的区别在于,这题的节点可以属于多条路,看了discuss后才明白 = = 真是不好好看题啊我。。<br /> <br />因为每个点可以属于多条路,如果只属于其中一条路的话,匹配后,另外连接这点的路可能就断了<br /> <br />所以用FLOYD讲图都连通,然后求最小覆盖即可。<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h原创 2011-03-15 22:10:00 · 987 阅读 · 0 评论 -
zoj 1002 Fire Net
<br />啊,这个经典题。<br /> <br />用最大二分匹配做,是上一道题的压缩版,以前用DFS搜过去了,昨天做那题,越想越觉得像这个,嘻嘻,今天随便改改,A掉了,嘿嘿~~<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#include <strin原创 2011-02-28 12:51:00 · 1061 阅读 · 0 评论 -
zoj 1239 Hanoi Tower Troubles Again!
<br />黑书上的题,今天随便看题居然看到了。。。<br /> <br />黑书上是用二分图的最小路径覆盖来理解这题的,用最小路径覆盖求得后,发现,这个解满足一个公式,我就直接套公式A掉了 = =。。<br /> <br />后用最大匹配做,发现是基本不能做的,因为是倒着匹配的,等于说是,已知有N个柱子,然后找一个数满足最大,等于说是需要枚举这些个数的,啊,我表示压力很大。。。<br /> <br />再者就是,用最大二分匹配打表,从p = 1开始,刚才试了N久,终于打成功了,不过TLE了。。。= =。。原创 2011-03-02 16:59:00 · 1219 阅读 · 0 评论 -
poj 1274 The Perfect Stall
可以当成最大流,也可以当成最大二分匹配。。。我现在还不会二分匹配。。。我是把它当成最大流做的。。多汇点,多源点的最大流。分别设一个源点汇点,即可。将奶牛和stall编号编一起,奶牛和每个喜欢的stall的容量是1,源点和每个奶牛的容量是1,每个stall和汇点的容量是1,求最大流即可。#include #include #include #include #include #include #define MAX 420using namespace std;int n,m;原创 2011-02-06 19:25:00 · 1002 阅读 · 0 评论 -
poj 1273 Drainage Ditches
<br /> <br />最大流第一题,水题。<br /> <br />大概意思就是求从源点到汇点的最大流啦。<br /> <br />WA了数次,看讨论,发现可能有重边 = =。。。边上的流量要加起来,好阴险啊。。。<br /> <br />白皮书上的模板~EK算法,增广路~看懂了,嘻嘻。自己能写下来了,很好呀~哇咔咔。。<br /> <br />#include <cstdio>#include <cstdlib>#include <iostream>#include <string.h>原创 2011-02-06 19:20:00 · 3135 阅读 · 2 评论 -
poj 3041 Asteroids
<br />恩。。。最小顶点覆盖。<br /> <br />给你N*N的矩阵,里面有的方格里有小行星,你需要用激光射掉它。。。激光可以射掉一行 或者一列的小行星,问最小需要发射多少次<br /> <br />最小顶点覆盖。。恩。。<br /> <br />对二分图最大匹配开始有点小误区,以为必须两个相连的顶点必须是不同编号的,所以呢,我之前都是把图建的好大。。。恩。。。<br /> <br />这个呢,正好看的某个论文里有类似这题的,直接建图就好了 = =。。按照给的行星的坐标建就好。。<br /> <br原创 2011-02-25 18:28:00 · 654 阅读 · 0 评论 -
zoj 1882 || poj 2536 Gopher II
<br />给你地鼠的坐标和洞的坐标,每个洞只能进一只地鼠,地鼠的奔跑速度,以及如果地鼠暴露在外面大于等于s秒,就有危险。<br /> <br />求出最小的有危险的地鼠的个数。<br /> <br />呃。。。开始没读清。。。求了最多的没危险的地鼠的个数。。。<br /> <br />建图很简单,找到地鼠和洞的长度,判断如果长度/速度 小于时间s,即建一条边。<br /> <br />然后求最大匹配数,最后用n减下就好。<br /> <br />#include <queue>#include <st原创 2011-02-25 16:05:00 · 1050 阅读 · 2 评论 -
zoj 1364 || poj 1325 Machine Schedule
<br />这题好早就看过了,没思路,当时。<br /> <br />然后昨天看了黑书上关于最大匹配的知识点,正好有道例题是这个,最小覆盖数,即建成二分图后,求最少的匹配把所有的点都覆盖上。<br /> <br />黑书上有证明,这个最小覆盖数即最大匹配数。(让我想起来最大流就是最小割。。。)<br /> <br />这个题是,给你AB两台机器,每个任务需要A的模式 或者 B的模式,而从A机子切换B需要重启一次,求最少的重启次数。<br /> <br />建图,把AB的模式建成点,边是任务,求最大匹配数即可原创 2011-02-25 16:02:00 · 1323 阅读 · 0 评论 -
zoj 1140 || poj 1469 Courses
<br />给你学生数和课程数,以及学生上的课,需要满足两点,每个学生代表不同的课程,所有的课程都被代表。<br /> <br />即用学生数和课程数建图,求最大匹配数,如果匹配数等于课程数,即满足条件输出Yes,反之输出No<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <lim原创 2011-02-25 15:54:00 · 1459 阅读 · 3 评论 -
匈牙利算法的理解。
<br /> <br />觉得这个说法比较好理解,恩。。图的编号自己理解吧。<br /> <br /> <br /><br /> <br /> <br />然后就是实现了,代码:<br /> <br />int Augement(int n,int x) // n是图节点数的上界 { int i; for(i=1; i<=n; i++) // 寻找增广路 if( !used[i] && map[x][i] ) { used[i] = 1; if( matc原创 2011-02-25 15:52:00 · 1162 阅读 · 0 评论 -
poj 1274 The Perfect Stall(匈牙利算法)
<br /> <br /> 这个之前用最大流做过了,用最大流模拟最大匹配。。。建立源汇然后。。<br /> <br />详见 http://blog.csdn.net/zxy_snow/archive/2011/02/06/6173428.aspx<br /> <br />这个是学了匈牙利算法后第一个想起来的题,就来写了下,刚才A掉了,16ms,查了下以前用EK最大流算法A的,300+MS。。时间差好多哎。。<br /> <br />说了,贴代码,水题一道,匈牙利的英文名字 Hungary。<br />原创 2011-02-25 15:44:00 · 1300 阅读 · 1 评论 -
poj 3281 Dining
<br />看论文的时候看到这题了,就做了下。<br /> <br />这题是,如果每头牛可以得到它喜欢的饮料和食物,算一个流量。<br /> <br />开始我想的是把食物和饮料放一起,但是不一定能正确,因为可能是两个饮料流到了牛那里 = =。<br /> <br />论文上说的是,将牛拆分成两个点,这两个点以容量1连接,一个点连饮料,一个点连食物。然后就成了多源点多汇点的最大流。<br /> <br />好神奇~!。。。EK算法297MS。。。看讨论似乎SAP 和 dinic 算法更强。。。学学吧。<b原创 2011-02-07 09:55:00 · 1274 阅读 · 5 评论 -
zoj 2404 || poj 2195 Going Home
最小费用最大流,EK中的BFS改成SPFA。。。建图拿人和房子建,费用是人和房子坐标差值,加源点和汇点,求最小费用最大流即可。我WA的厉害 = =。。。少加了句cost[to][from] = -cost[from][to];。。。#include #include #include #include #include #include #include #define MAX 210using namespace std;typedef struct HOUSE{原创 2011-02-07 13:55:00 · 1936 阅读 · 4 评论 -
zoj 3362 Beer Problem
最小费用最大流。开始用邻接矩阵做的,无奈死活WA,应该是两个城市的边不止一条 = =。。。无奈邻接表没写过,网上搜了个能理解的模板,学习之。。。里面有个异或求反向边的,如果a是偶数,a^1 = a-1 。a是奇数,a^1 = a+1。正好是建图的时候的反向边。。还有要注意的时候,就是建图的时候,这个是双向的。。。建立一个汇点,把最后卖出的价钱取负值当做费用,然后求最短路,答案取负即可。#include #include #include #include #include #includ原创 2011-02-07 23:04:00 · 1224 阅读 · 2 评论 -
zoj 1525 || poj 1422 Air Raid
最小路径覆盖。给你顶点和顶点,求最少的今晚在晚自习看了下黑书上的最小路径覆盖,最小路径 = n - 最大匹配边数。开始想麻烦了, = =。。。用 FOLYD 把边都给连上了,WA掉了,去了就A了,YM啊YM。。。#include #include #include #include #define MAX 150using namespace std;int map[MAX][MAX];int used[MAX],mat[MAX];int Augment(int n,int原创 2011-02-28 23:13:00 · 1520 阅读 · 0 评论 -
zoj 1654 Place the Robots
纠结了N久,不知不觉可都11点半了!!赶紧写完。。明早还有课呢。。这题刚做最大二分匹配就瞅见了,因为看过黑书,觉得应该是最大独立集神马的知识,就放着没做。今天下决心给它A掉,正好下的资料中有解说这题的,其实这题很像 1002 的扩大版。。。给你地图,机器人可以发射上下左右的激光,如果俩机器人之间有墙隔着就可以放同一行,同一列。。。真的和1002很像。。。这里面还有玻璃。。玻璃不能放机器人,但是可以穿过激光。问最大放机器人的数量,就是最大独立集。建图很是纠结,我觉得我建得也没错。。。但是一直WA,又换了种建图原创 2011-02-27 23:36:00 · 1775 阅读 · 2 评论 -
zoj 1157 || poj 1087 A Plug for UNIX
<br />最大二分匹配,建图真繁琐!!!<br /> <br />读题读了半天。。。<br /> <br />大意是,一些设备需要固定型号的插座,有的插座可以通过另一种设备得到。<br /> <br />比如样例<br /> <br /> <br />4 <br />A <br />B <br />C <br />D <br />5 <br />laptop B <br />phone C <br />pager B <br />clock B <br />comb X <br />3 <br />B X原创 2011-02-27 15:53:00 · 1455 阅读 · 0 评论 -
poj 3692 Kindergarten
<br />啊。。这次终于挑相互认识的小盆友出去玩咧。。呵呵。。<br /> <br />女生之间都相互认识,男生之间也是。给你男女认识对数,求出最大数量的小盆友相互都认识。。。<br /> <br />类似于之前那几道,建图,只不过这次匈牙利算法算的是未标记的图,在讨论里见这个叫补图。。。<br /> <br />开始一直不对因为,这个矩阵不是N*N的,因为我的初始化全是0,而最后判断的也是0的点才。。。所以界限需要严格定一下。。。<br /> <br />最后就用总人数减去不认识的最少人数(最小顶点覆盖原创 2011-02-26 22:26:00 · 1377 阅读 · 0 评论 -
poj 2771 Guardian of Decency
<br />这个算是经典题了。<br /> <br />郁闷啊,怎么最大独立集都是拿学生不准谈恋爱作为背景。。<br /> <br />将可以谈的童鞋之间连线,求最大匹配,然后用总顶点数 - 最大匹配数即可。<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>#include <limits.h>#原创 2011-02-26 21:13:00 · 1172 阅读 · 0 评论 -
zoj 1137 || 1466 Girls and Boys
<br /> <br />二分图的最大独立集=顶点数-二分图的最大匹配数<br /><br /><br />二分图的最小顶点覆盖=二分图的最大匹配数<br /><br /><br />二分图的最小路径覆盖=顶点数-二分图的最大匹配数<br /> <br />zoj上居然没写数据范围。。。poj写了。<br /> <br />这题是求最大独立集。<br /> <br />给你 romantically involved 的关系,求出最多的不满足这个关系的集合数。<br /> <br />因为1-2 2-1 算原创 2011-02-26 18:31:00 · 20057 阅读 · 2 评论 -
poj 2239 Selecting Courses
<br />继续匈牙利水题。。。<br /> <br />给你课程以及上课时间,问你一周最多可以选多少次课。每节课最多只能上一次。<br /> <br />建图很简单,课程和每周的第几节课建图,WA了一次, = = 一天12节我想成一天7节了,笨。。。<br /> <br />#include <queue>#include <stack>#include <math.h>#include <stdio.h>#include <stdlib.h>#include <iostream>原创 2011-02-25 22:48:00 · 1027 阅读 · 0 评论