huangriq

导航

随笔分类 -  网络流

hdu 4411(最小权匹配or费用流)
摘要:题意:n个小偷在n个不同城市,某些城市之间有道路连接,k个警察在城市0,问将所有小偷抓好城市0警察所花费的最小总路程,还有一个条件是抓小偷必须按1,2,3,4……n顺序。思路:可以用最小权匹配来做,抓每个小偷的警察必然是从小偷编号之前的那些城市过来的,所以每个城市能被你比他编号小的城市所匹配。而城市0则可以拆成个点,这k个点可以匹配任意点,也可以被任意点匹配。总体来说相当于将城市路径分解成k个环,求解这k个环的最小长度和。View Code费用流建图:将每个城市拆成出点和人点,两点之间加一条容量为1,费用为-M的边,其中M要尽量大。0点到每个入点连一条容量为1费用为0的边,每个出点到汇点连接一 阅读全文

posted @ 2012-10-02 23:25 huangriq 阅读(349) 评论(0) 推荐(0)

poj 1637(混合图求欧拉回路)
摘要:参考博客:http://www.cnblogs.com/destinydesigner/archive/2009/09/28/1575674.html1 定义欧拉通路 (Euler tour)——通过图中每条边一次且仅一次,并且过每一顶点的通路。欧拉回路 (Euler circuit)——通过图中每条边一次且仅一次,并且过每一顶点的回路。欧拉图——存在欧拉回路的图。2 无向图是否具有欧拉通路或回路的判定G有欧拉通路的充分必要条件为:G 连通,G中只有两个奇度顶点(它们分别是欧拉通路的两个端点)。G有欧拉回路(G为欧拉图):G连通,G中均为偶度顶点。3 有向图是否具有欧拉通路或回路的判定D有欧拉 阅读全文

posted @ 2012-08-12 09:21 huangriq 阅读(319) 评论(0) 推荐(1)

poj 2175(费用流消圈)
摘要:题意:给出n栋房子位置和每栋房子里面的人数,m个避难所位置和每个避难所可容纳人数。然后给出一个方案,判断该方案是否最优,如果不是求出一个更优的方案。思路:很容易想到用最小费用流求出最优时间,在与原方案花费时间对比判断原方案是否最优。但是这种方法会超时的。其实还有一种复杂度更低的方法:判断原方案在费用流模型中是否有负环,如果有,将负环中的每条边流量加一就可以达到更优。定理:一个费用流是最小费用流的充要条件是这个费用流的残量网络没有负费用圈。(我是根据费用流模型加流实现,可以有更好的建图方法)费用流消圈:View Code 1 #include<iostream> 2 #include 阅读全文

posted @ 2012-05-08 09:50 huangriq 阅读(410) 评论(1) 推荐(0)

poj 2195(最小费用流)
摘要:题意:一个矩阵中不同位置给出n个人,和n个房子,求解n个人分别回到n个房子的最小时间花费。思路:最大权匹配,可用最小费用流,km算法求解。最小费用流算法:View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 #include<algorithm> 5 using namespace std; 6 #define inf 0x3f3f3f3f 7 #define N 100010 8 #define M N*10 9 struct edge{ 10 int 阅读全文

posted @ 2012-05-04 14:26 huangriq 阅读(378) 评论(0) 推荐(0)

poj 3041( 最大匹配)
摘要:题意:给出一个矩阵和一些矩阵上的点,选择最少的行或列把给出的点覆盖。思路:把行看成一个点集,列看成另一个点集,每个给出点构造一条这两个点集中的一条边。我们的问题就变成了选择最少的点把所有的边覆盖。很显然这就是一个最大独立点集问题,可用最大匹配求解。匈牙利匹配算法:View Code 1 #include<iostream> 2 #include<stdio.h> 3 #include<string.h> 4 using namespace std; 5 #define N 10010 6 #define M 20020 7 struct edge{ 8 in 阅读全文

posted @ 2012-05-04 14:19 huangriq 阅读(271) 评论(0) 推荐(0)