网络流

poj_3281Dining(网络流+拆点)

删除回忆录丶 提交于 2020-04-07 06:27:53
poj_3281Dining(网络流+拆点) 标签: 网络流 题目链接 题意: 一头牛只吃特定的几种食物和特定的几种饮料,John手里每种食物和饮料都只有一个,问最多能够满足几头牛的需求(水和食物都必须和他们的胃口)。 题解: 网络流 建图:从源点向每个食物连一条边,容量为1, 将牛拆成两个点牛,牛',中间连边,容量为1 从食物向牛连边,容量为1 连牛'和饮料,容量为1 连饮料和汇点,容量为1 网络流三种算法的理解和代码实现以及相应的模板 先介绍一个定理: 最大流最小割定理: 割:去掉某几条边使得源点和汇点不再联通,那么这几条边就叫一个割,这几条边的边权和最小的就叫做最小割。 一个图的最大流就是这个图对应的最小割,可以看做是一个沙漏,最大流是要求这个沙漏每个时刻最大的流量,那就相当于是求沙漏最细的地方的流量。而最小割就相当于是用一个刀子将这个沙漏一分为二,然后找横截切面最小的就是这个沙漏最细的地方。 再介绍一些网络流的一些基本性质 流网络G的流(flow)是一个实值函数 f :V ×V → R,且满足下列三个性质 (1) 容量限制:对于∀u,v∈V ,要求 f (u,v) ≤ c(u,v)。 (2) 反对称性:对于∀u,v∈V ,要求 f (u,v) = −f (v,u)。 (3) 流守恒性:对于∀u,v∈V −{s,t},要求∑f (u,v) =0。 f(u,v)即为u到v的流

Dinic算法学习

不想你离开。 提交于 2020-04-04 06:04:04
转自 此文虽为转载,但博主的网络流就是从这开始的,认为写的不错 网络流基本概念 什么是网络流 在一个有向图上选择一个 源点 ,一个 汇点 ,每一条边上都有一个流量上限(以下称为 容量 ),即经过这条边的流量不能超过这个上界,同时,除源点和汇点外,所有点的入流和出流都 相等 ,而源点只有流出的流,汇点只有汇入的流。这样的图叫做 网络流 。 所谓网络或容量网络指的是一个连通的赋权有向图 D= (V、E、C) , 其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。(引自百度百科) 定义 我们定义: 源点:只有流出去的点 汇点:只有流进来的点 流量:一条边上流过的流量 容量:一条边上可供流过的最大流量 残量:一条边上的容量-流量 几个基本性质 基本性质一: 对于任何一条流,总有流量<=容量 这是很显然的 基本性质二 对于任何一个不是源点或汇点的点u,总有 ∑ p ∈ E k [ p ] [ u ] == ∑ q ∈ E k [ u ] [ q ] ( 其 中 k[i][j] 表 示 i 到 j 的 流 量 ) 这个也很显然,即一个点(除源点和汇点)的入流和出流相等 基本性质三

最大流 dinic

余生长醉 提交于 2020-04-04 05:59:08
Dinic算法(研究总结,网络流) 网络流是信息学竞赛中的常见类型,笔者刚学习了最大流Dinic算法,简单记录一下 网络流基本概念 什么是网络流 在一个有向图上选择一个 源点 ,一个 汇点 ,每一条边上都有一个流量上限(以下称为 容量 ),即经过这条边的流量不能超过这个上界,同时,除源点和汇点外,所有点的入流和出流都 相等 ,而源点只有流出的流,汇点只有汇入的流。这样的图叫做 网络流 。 所谓网络或容量网络指的是一个连通的赋权有向图 D= (V、E、C) , 其中V 是该图的顶点集,E是有向边(即弧)集,C是弧上的容量。此外顶点集中包括一个起点和一个终点。网络上的流就是由起点流向终点的可行流,这是定义在网络上的非负函数,它一方面受到容量的限制,另一方面除去起点和终点以外,在所有中途点要求保持流入量和流出量是平衡的。(引自百度百科) 定义 我们定义: 源点:只有流出去的点 汇点:只有流进来的点 流量:一条边上流过的流量 容量:一条边上可供流过的最大流量 残量:一条边上的容量-流量 几个基本性质 基本性质一: 对于任何一条流,总有流量<=容量 这是很显然的 基本性质二 对于任何一个不是源点或汇点的点u,总有 ∑ p ∈ E k [ p ] [ u ] == ∑ q ∈ E k [ u ] [ q ] (其中k[i][j]表示i到j的流量) ∑p∈Ek[p][u]==∑q∈Ek[u][q

【网络流24题-18】分配问题 网络流 费用流

无人久伴 提交于 2020-03-30 06:49:40
题目描述   有n件工作要分配给n(n<=100)个人做。第i个人做第 j件工作产生的效益为cij。试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大。对于给定的n件工作和 n个人,计算最优分配方案和最差分配方案。 题目大意   见题目描述 A.A 数据范围   见题目描述 A.A 样例输入 5 2 2 2 1 2 2 3 1 2 4 2 0 1 1 1 2 3 4 3 3 3 2 1 2 1 样例输出 5 14 解题思路   S点向人连边,权值为1,费用为0,人向物品连边,权值为1,费用为Cij,物品向T连边,权值为1,费用为0。   最小效益则为最小费用流,最大收益为最大费用流(关于最大费用流的问题,我是将费用取反,最后的答案也取反,当然也可以SPFA求最长路)。 代码 #include <algorithm> #include <iostream> #include <cstring> #include <cstdlib> #include <cstdio> #include <cmath> #include <queue> #define Maxn 23333 #define Maxe 23333 using namespace std; inline int Getint(){int x=0,f=1;char ch=getchar();while('0'

hdu 3549 网络流模板题

老子叫甜甜 提交于 2020-03-11 01:39:51
题意:网络流模板题,求1到n的最大流,直接写模板。 代码: #include <cstdio> #include <algorithm> #include <queue> #include <cstring> #define N 30 #define INF 1000000 using namespace std ; int Map [ N ][ N ], path [ N ], t , n , m ; bool bfs ( int s , int t ){ memset ( path ,- 1 , sizeof ( path )); queue < int > q ; int p ; path [ s ]= s ; q . push ( s ); while (! q . empty ()){ p = q . front (); q . pop (); for ( int i = 1 ; i <= n ; i ++){ if ( Map [ p ][ i ]> 0 && path [ i ]==- 1 ){ path [ i ]= p ; if ( i == t ) return true ; q . push ( i ); } } } return false ; } int Ek ( int s , int t ){ int flow = 0 , d ; while (

【网络流24题】汽车加油行驶

狂风中的少年 提交于 2020-03-08 08:04:03
【网络流24题】汽车加油行驶 Description 给定一个N * N 的方形网格,设其左上角为起点◎,坐标为(1,1),X 轴向右为正,Y轴向下为正,每个方格边长为1,如图所示。一辆汽车从起点◎出发驶向右下角终点▲,其坐标为(N,N)。在若干个网格交叉点处,设置了油库,可供汽车在行驶途中加油。汽车在 行驶过程中应遵守如下规则: (1)汽车只能沿网格边行驶,装满油后能行驶K 条网格边。出发时汽车已装满油,在起点与终点处不设油库。 (2)汽车经过一条网格边时,若其X 坐标或Y 坐标减小,则应付费用B,否则免付费用。 (3)汽车在行驶过程中遇油库则应加满油并付加油费用A。 (4)在需要时可在网格点处增设油库,并付增设油库费用C(不含加油费用A)。 (5)(1)~(4)中的各数N、K、A、B、C均为正整数,且满足约束:2 £ N £ 100,2 £ K £ 10。 设计一个算法,求出汽车从起点出发到达终点的一条所付费用最少的行驶路线。 Input 第一行是N,K,A,B,C的值。 第二行起是一个N * N 的0-1 方阵,每行N 个值,至N+1 行结束。方阵的第i 行第j 列处的值为1 表示在网格交叉点(i,j)处设置了一个油库,为0 时表示未设油库。各行相邻两个数以空格分隔。 Output 最小费用 Sample Input 9 3 2 3 6 0 0 0 0 1 0 0 0 0 0

方格取数问题(网络流)

十年热恋 提交于 2020-03-04 08:31:53
方格取数问题(luogu) Solution 可以利用网络流对“斥”的求解 先假设所有点都选,不选某些点可以使选择的方案合法,求出这些不选的点的价值总和的最小值 最小值联想到最小割 根据(横坐标+纵坐标)的奇偶性将图分成两部分 在不能同时选的点间连边(方向偶-奇),由于“割”时不能割掉点之间不能同时选的关系,所以它的流量应为正无穷 再从起点向偶部的每个点连一条流量为这个点的价值的边,从奇部的每个点向终点连一条流量为这个点的价值的边, 表示不选它失去的价值 跑最大流(即最小割) Code #include <cstdio> #include <cstdlib> #include <queue> #include <algorithm> #include <cstring> using namespace std; const int N=1e4+10,M=1e5; int head[N],nxt[M],ver[M],edge[M],tot=1; int s,t,n,m,d[N],x,maxflow,flow,sum,inf=1<<30; int id(int x,int y) { return (x-1)*m+y; } void add(int u,int v,int w) { ver[++tot]=v,nxt[tot]=head[u],edge[tot]=w,head[u]=tot

●hihocoder #1394 网络流四·最小路径覆盖

你离开我真会死。 提交于 2020-03-04 07:41:36
题链: http://hihocoder.com/problemset/problem/1394 题解: 有向图最小路径覆盖:最少的路径条数不重不漏的覆盖所有点。 注意到在任意一个最小路径覆盖的方案下, 每条路径的起点的入度为 0,终点的出度为 0,而中间的点的入度和出度以及起点的出度和终点的入度都为 1 那么把每个点拆为两个: u 和 u',分别代表其 出点 和 入点 然后对于 边 u->v, 在 u 和 v' 之间建立双向边。 那么形成二分图。 二分图匹配后,某条匹配边上的起点的出度 +1,终点的入度 +1, 那么没有被匹配到的 u'则是某条路径的起点(即没有入度), 那么没有被匹配到的 u 则是某条路径的终点(即没有出度), 正好二分图最大匹配后,没有被匹配的u'(或u)的个数是最少的,则表明路径是最少的(起点或终点是最少的)。 又因为 没有被匹配的 u'的数量 == 点数N - 匹配数 所以,有向图最小路径覆盖 =点数 -二分图最大匹配数 (更加详细的图文讲解,非常不错的 http://blog.csdn.net/tramp_1/article/details/52742572) 二分图匹配可以用匈牙利,也可以用最大流来做。 代码: #include<queue> #include<cstdio> #include<cstring> #include<iostream>

网络流24题-分配问题

£可爱£侵袭症+ 提交于 2020-03-04 04:25:43
分配问题 时空限制 1000ms / 256MB 题目描述 有 n 件工作要分配给 n 个人做。第 i 个人做第 j 件工作产生的效益为 c[i][j] 。试设计一个将 n 件工作分配给 n 个人做的分配方案,使产生的总效益最大。 输入输出格式 输入格式: 文件的第 1 行有 1 个正整数 n ,表示有 n 件工作要分配给 n 个人做。 接下来的 n 行中,每行有 n 个整数 c ​​,表示第 i 个人做第 j 件工作产生的效益为 c[i][j] ​ 。 输出格式: 两行分别输出最小总效益和最大总效益。 输入输出样例 输入样例: 5 2 2 2 1 2 2 3 1 2 4 2 0 1 1 1 2 3 4 3 3 3 2 1 2 1 输出样例: 5 14 说明 1 ≤ n ≤ 1 0 0 一个人只能做一个工作 二分图多重最优匹配。 感觉就是费用流,只不过知道模型容易建图了一些。 #include<bits/stdc++.h> #define N 505 #define INF LLONG_MAX/2 using namespace std; typedef struct { int u,v; long long flow,cost; }ss; ss edg[N*N]; vector<int>edges[N]; int now_edges=0; void addedge(int u

Libre 6012 「网络流 24 题」分配问题 (网络流,费用流)

时光毁灭记忆、已成空白 提交于 2020-03-04 04:17:31
Libre 6012 「网络流 24 题」分配问题 (网络流,费用流) Description 有n件工作要分配给n个人做。第i个人做第j件工作产生的效益为 \(c_{ij}\) 。试设计一个将n件工作分配给n个人做的分配方案,使产生的总效益最大。 对于给定的n件工作和n个人,计算最优分配方案和最差分配方案。 Input 第1 行有1 个正整数n,表示有n件工作要分配给n 个人做。 接下来的n 行中,每行有n 个整数 \(c_{ij}\) ,1≤i≤n,1≤j≤n,表示第i 个人做第j件工作产生的效益为 \(c_{ij}\) 。 Output 将计算出的最小总效益和最大总效益输出 Sample Input 5 2 2 2 1 2 2 3 1 2 4 2 0 1 1 1 2 3 4 3 3 3 2 1 2 1 Sample Output 5 14 Http Libre: https://loj.ac/problem/6012 Source 网络流,费用流 解决思路 此题的网络流做法还是比较明显的。对于每一个人,从源点连边容量为1代价为0,而对于每一项工作,连到汇点容量为1,代价为0。对于每一个 \(c_{ij}\) ,连接人i和工作j,容量为1代价为 \(c_{ij}\) 。然后分别跑最小费用最大流和最大费用最大流即可。 代码 #include<iostream> #include