![](https://img-blog.csdnimg.cn/20201014180756928.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
图
文章平均质量分 68
tragedies
这个作者很懒,什么都没留下…
展开
-
poj2195 Going Home
这题可以看出是一个裸的km算法题,直接套模板即可,同时要注意的是在算的时候先取反.(思路二:其实还可以转化为求最小费用,设一个超级源点把人连起来,各超级汇点把房间连起来,然后求解即可)var n,m,k1,k2,delta:longint; w:array[1..100,1..100]of longint; lx,ly,match:array[1..100]of longint;原创 2013-06-13 10:34:06 · 415 阅读 · 0 评论 -
poj3041 Asteroids
经典的最小点覆盖。对于一个小行星来说,要么清理该行,要么该列时清理掉,所以也就是每个小行星对应的行列中至少选择一样来清理。下面建图,如果我们把每行看成集合一中的点,每列看成集合二中的点,一个小行星看成是其对应行列的连线,那么也就是说不能存在某一条连线两边的点都没有被选中的情况。这恰好就是二分图最小点集覆盖的要求。var n,k:longint; g:Array[1..500,1..500]原创 2013-06-13 14:51:14 · 442 阅读 · 0 评论 -
二分图匹配算法总结
(转自http://blog.163.com/baobao_zhang@126/blog/static/482523672008631103625967/)一、二分图最大匹配 二分图最大匹配的经典匈牙利算法是由Edmonds在1965年提出的,算法的核心就是根据一个初始匹配不停的找增广路,直到没有增广路为止。 匈牙利算法的本质实际上和基于增广路特性的最大流算法还转载 2013-06-04 23:17:55 · 732 阅读 · 0 评论 -
poj2446 Chessboard
继续发二分图匹配的题。本题比较容易想到要在能放的格子间建立二分图,但在实际中建图可能会比较麻烦。其实,可以在每个相邻的格子连两条反向的边,然后进行二分图匹配,所得的匹配数应是m*n-k.(之前在网上看到的另一种思路,可以发现任何相邻两点的各自的横纵坐标之和必是一奇一偶,故可以以和为奇的点为左边的点,和为偶的点为右边的点,然后二分图匹配,此时所得的匹配数应是(m*n-k)/2).co原创 2013-06-04 19:51:06 · 508 阅读 · 0 评论 -
poj2594 Treasure Exploration
这是个最小路径覆盖问题,但是因为有的点可以重复访问,所以最小路径是可以相交的,我们就用传递闭包建立新图(G’),转化为一般的路径覆盖,之后求法一样。var n,m:longint; g:array[1..500,1..500]of boolean; match:array[1..500]of longint; h:array[1..500]of boolean;procedure i原创 2013-06-13 18:48:13 · 480 阅读 · 0 评论 -
poj1548 Robots
看到这题可以发现是二分图最短路径覆盖问题,其实我们可以这样建图。以垃圾点为节点,若能从i走到j则连一条边,这样二分图就建起来了。(刚刚翻看了一下discuss,发现本题还有一个贪心的神解法,似乎要用到偏序集上的Dilworth定理,做法与poj1065,3636类似)var k:longint; a:array[1..1000,1..2]of longint; g:array[1..原创 2013-06-13 18:28:30 · 628 阅读 · 0 评论 -
最大匹配的Hopcroft-Karp算法
郁闷,csdn如何插公式?独立集:设 I 是 G 的一个点子集,若 I 中任意两个顶点不相邻,则称 I是 G 的一个独立集。最大独立集,指点数最多的独立集。根据定理,易知独立集与点覆盖互补。算法分为若干阶段,每阶段包含若下步骤:(1)将左侧未匹配点集设为起点,按照交错路径的条件,BFS,对图分层,在某层出现未匹配的右边点时停止(2)将左侧未匹配点集设为起点,按照层的顺序,和交错原创 2013-06-13 15:33:24 · 1635 阅读 · 2 评论 -
最小点覆盖
点覆盖:设 K 是图 G 的一个点子集,若 G 中的每一条边至少有一个端点在 K 中,则称 K 是 G 的一个点覆盖。最小点覆盖,指点数最少的点覆盖。könig Theorem(könig定理): 一个二分图中的最大匹配数等于这个图中的最小点覆盖数。证明: 假如我们已经通过匈牙利算法求出了最大匹配(假设它等于M),下面给出的方法可以告诉我们,选哪M个点可以覆盖原创 2013-06-13 14:54:37 · 2333 阅读 · 0 评论 -
poj3216 Repairing Company
这道题依然是最小路径覆盖裸题,以每个任务为节点建立二分图,之后再求最大匹配数,然后再用总任务数减去最大匹配数即可。var q,m:longint; a:array[1..200,1..3]of longint; dis:array[1..20,1..20]of longint; g:array[1..200,1..200]of longint; t,match:array[1..20原创 2013-06-13 14:22:02 · 599 阅读 · 0 评论 -
poj2239 Selecting Courses
最近在学二分图匹配(是的,你没看错,我也没开玩笑,对此我也很无奈),继续发匹配的水题。poj2239其实很容易就可以看出来可以把课程跟日程建立二分图,然后用匹配做。var n,i,j,p,q:longint; a:array[1..310,1..310]of longint; t:array[1..310]of longint; match:array[1..310]of long原创 2013-06-04 19:40:21 · 477 阅读 · 0 评论 -
poj2060 Taxi Cab Scheme
这道题依然是一道裸的最短路径覆盖,注意建图。建图:以每个任务为节点,若是从任务i能在规定的时间内到达任务j,则从i连一条边到j。const MAXN=500;var tc,n:longint; a,as,ae:array[1..MAXN,1..2]of longint; g:array[1..MAXN,1..MAXN]of longint; match,t:array[1..MA原创 2013-06-13 14:00:04 · 505 阅读 · 0 评论 -
最小路径覆盖
路径覆盖:选取一些不相交的路径 (包括单个点),使得能覆盖所有的点。最小路径覆盖指路径覆盖中路径最少的一种。算法:(1)将有向无环图转为二分图(2)一组匹配等价于在原图中走了一条边(3)答案 = 原图点数 -最⼤匹配最小路径覆盖=|P|-最大匹配数;其中最大匹配数的求法是把图P中的每个顶点pi分成两个顶点pi'与pi'',如果在p中存在一条pi到pj的边,那么在二分图P原创 2013-06-13 12:51:55 · 486 阅读 · 0 评论 -
poj1422 Air Raid
本题若读懂题目就会发现是一道最短路径覆盖的裸题,之后先把无向图转化为二分图,然后再用匈牙利算法求出其最大匹配数,最后最短路径覆盖数就是n-最大匹配数。建图方法:先拆点,将每个点分为两个点,左边是1到n个点,右边也是1到n个点,然后每一条有向边对应左边的点指向右边的点即可const MAXN=120;var tc,n,m:longint; g:array[1..MAXN,1..MAXN原创 2013-06-13 12:45:28 · 481 阅读 · 0 评论 -
网络流算法整理
(转自http://blog.csdn.net/wangjian8006/article/details/7939599)EK(EdmondsKarp)算法:这个算法改进于Ford-Fulkerson算法,Ford-Fulkerson算法是不断用广搜找一条增广路,然后判断一次这条路的最小流量,再对这条路增流,而EK与FF算法不同的是用一个数组记录了广搜之后增广路的最小流量,然后再根据父亲数转载 2013-06-13 12:39:56 · 1365 阅读 · 0 评论 -
KM算法
算法原理:(1)通过给每个顶点一个顶标,把求最大权匹配的问题转化为求完备匹配的问题(2)设顶点 Ai 的顶标为 Xi ,顶点 Yj 的顶标为 Bj ,顶点 Xi与 Yj 之间的边权为 Wi;j(3)在算法执二过程中的任一时刻,对于任一条边 ,Ai + Bj >= Wi;j 始终成立(4)若由二分图中所有满⾜ Ai + Bj = Wi;j 的边 存在完备匹配,这个完备匹配就是⼆分图原创 2013-06-13 10:43:28 · 437 阅读 · 0 评论 -
KM算法 详解+模板
(转自http://blog.sina.com.cn/s/blog_691ce2b701016reh.html)【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),称为可行转载 2013-06-13 10:38:15 · 686 阅读 · 0 评论 -
poj2226 Muddy Fields
这题也是一道经典的最小点覆盖问题,但是注意本题中不是整行整列地消除,而是消除连续的格子,因此先把连续的格子当成一个整体标号,然后当行列相交时连边。var r,c,nx,ny:longint; s:array[1..50]of string; g,tx,ty:array[1..3000,1..3000]of longint; match,t:array[1..3000]of longin原创 2013-06-13 17:10:36 · 444 阅读 · 0 评论