网络流

线性规划--最大网络流

醉酒当歌 提交于 2020-01-24 17:44:31
假期 2020.01 .24 问题分析(内容摘自离散数学结构) 算法分析(内容摘自离散数学结构) 其实该问题是离散数学中了解到的最大网络流问题,借助最短增广路算法即可解决该问题。 而最短增广路算法实现是: 代码解析 # include <iostream> # include <algorithm> # include <iomanip> # include <queue> using namespace std ; constexpr auto Max_size = 0x7fffffff ; int point_count , edge_count ; //节点数,边数 int left_map [ 100 ] [ 100 ] ; //实邻接关系 int ok_map [ 100 ] [ 100 ] ; //虚邻接关系 int pre_map [ 100 ] ; //前驱 int visited [ 100 ] ; //访问数组 int Search_current ( ) ; //寻找路径 int best_ability ( ) ; //寻找最优路径 int main ( ) { int i , j , v , w , flow ; cout << "请输入节点个数与网络连接边数:" ; cin >> point_count >> edge_count ; cout <<

错题本

不羁岁月 提交于 2020-01-24 17:19:40
数组初始化 -inf ,一定不要用 memset ,用 fill 网络流存边 edgecnt 初始时记得赋值为 1 二分答案 int mid=(l+r)>>1 后一定要 mid++ 费用流不管费用最大最小, cur 数组初始都要赋值为 inf 网络流存边 edgecnt 初始时记得赋值为 1 重要!!! 网络流拆点千万别拆错了 详细信息: 来源: CSDN 作者: Brian PYL 链接: https://blog.csdn.net/Brian_Pan_/article/details/104079609

上下界网络流的建模

会有一股神秘感。 提交于 2020-01-23 11:17:11
【目录】 无源汇可行流 有源汇可行流 有源汇最大流 有源汇最小流 有源汇费用流 无源汇可行流 给出一个网络,没有源点和汇点,每条边有一个最低流量和一个最高流量,问在满足流量平衡(流入等于流出)的前提下,能否满足所有的流量限制? 问题分析 设该网络为 \(G=(V,E)\) ,限制条件为每个点都应该满足"流量守恒",即 对于 \(\forall x \in G\) ,有 \[\sum\limits_{(u,x)\in E}f(u,x)=\sum\limits_{(x,v)\in E}f(x,v)\] 设边 \(e\) 的下界为 \(lower(e)\) ,上界为 \(upper(e)\) ,则流量 \(f(e)\) 应满足 \[lower(e)\leq f(e) \leq upper(e)\] 要求判断是否存在一种可行方案。 建模方式 考虑先处理掉每条边的流量下界,即强制让当前每条边 \(e\) 的流量 \(f(e)\) = \(lower(e)\) 。但这样会导致无法满足"流量守恒"。现在的问题是,每条边仅有流量上界 \(upper(e)-lower(e)\) ,要给每条边增加一些流量,使所有结点满足"流量守恒"。 首先建立附加源 \(s'\) ,附加汇 \(t'\) 当每条边的流量都为下界流量时,结点 \(x\) 存在 总流入 与 总流出 ,设 \(d(x)=\) 总流入 \(-

网络流学习笔记

故事扮演 提交于 2020-01-23 07:26:30
网络流学习笔记: $ by~~wch $ 前言: 本文篇幅较长,结合右上角的目录了浏览会方便一些 然后本文主要还是自己复习所用,会偏向讲一些(博主经常忘的)核心,有些地方讲得粗略请谅解,所以大家可以对书看,书上都是大佬写的比较全面。(额,假定大家都有认真看书) 然后基本概念库里的知识比较多,实在接受不了直接往后看算法,博主尽量会在算法前标注需要的基本概念(或者直接讲),大家再回来挑着反复看就好。但是尽量要明白算法核心,只要懂了最大流的原理,这些基本概念会显得比较简单。另外带*号的可以忽略,博主也不会讲。 然后我们要有能学好网络流的信心,这个很重要! 一、基本概念库: 本文中弧和边是一个东西,然后大家要注意 容量 和 流量 是不同的两个概念; 残留容量和剩余流量是一个东西 ,但他们和 实际流量 要区分开来! 容量网络和网络最大流: 容量网络: 设 $ G(V, E) $ 是一个有向图, $ V $ 为点集, $ E $ 为边集,在 $ V $ 中有两个指定的特殊顶点: 源点 ( $ S $ )和 汇点 ( $ T $ )。每一条弧(边) $ <u, v>∈E $ ,都有一个给定权值 $ c(u, v) $ ,称为 弧的容量 。这样的有向网络 $ G $ 被称为容量网络。 弧的流量: 通过容量网络 $ G $ 中每条弧 $ <u, v> $ 上的 实际流量 (简称流量),记为 $ f

网络流

早过忘川 提交于 2020-01-22 21:05:39
一个网络 \(G=(V,E)\) 是一张有向图,图中每条有向边 \((x,y)\in E\) 都有一个给定的权值 \(c(x,y)\) ,称为边的容量。特别地,若 \((x,y) \notin E\) ,则 \(c(x,y)=0\) 。图中还有两个指定的特殊节点 \(S,T \in V(S \neq T)\) 分别被称为源点和汇点。 设 \(f(x,y)\) 是定义在节点二元组 \((x \in V,y \in V)\) 上的实数函数,且满足: 容量限制: \(f(x,y) \leq c(x,y)\) 斜对称: \(f(x,y)=-f(y,x)\) 流量守恒: \(\forall x \neq S,\ x \neq T,\ \sum_{(u,x)\ \in E} f(u,x) = \sum_{(x,v)\ \in E}f(x,v)\) \(f\) 称为网络的流函数,对于 \((x,y) \in E\) , \(f(x,y)\) 称为边的流量, \(c(x,y)-f(x,y)\) 称为边的剩余流量 \(\sum_{(S,v)\ \in E} f(S,v)\) 称为整个网络的流量( \(S\) 为源点) 最大流 Edmond—Karp算法 若一条从源点 \(S\) 到汇点 \(T\) 的路径上各条边的剩余容量都大于 \(0\) ,则称这条路径为一条增广路 \(EK\) 算法为用 \

网络流之最小割

断了今生、忘了曾经 提交于 2020-01-22 13:17:22
最小割是什么? 对于给定网络,为了保证没有从s到t的路径,需要删去的边的总容量的最小值为多少? 这个问题就是让你求最小割。 最大流最小割定理:最小割=最大流。 可以利用最大流算法求解最小割。 由ff算法的正确性可以知道,如果所有边的容量都是整数,那么最大流和最小割也是整数。 具体的证明等等参见 网络流【最大流&&最小割&&费用流】——一篇简单易懂的博文 来源: CSDN 作者: lpls1 链接: https://blog.csdn.net/qq_42021845/article/details/104066394

「网络流 24 题」魔术球

假如想象 提交于 2020-01-22 01:29:01
比较有意思的题 题意:给你n个柱子,问你可以在上面放多少个编号连续且每根柱子上相邻的编号为平方数的球 洗澡时候想的,根据平方数这个关系建边,然后枚举多少个柱子,然后再在图上跑最小路径覆盖,若路径条数大于柱子数,那么珠子数-1就是答案 我写的有点....t了,但不想改 #include<bits/stdc++.h> using namespace std; int n,tot=-1,h[3005],ans=0,hou[3005]; struct node{ int from,next,to,rest,full; int last; }e[1000005]; bool judge[60005]; void add(int x,int y,int z){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].from=x; e[tot].to=y; e[tot].rest=z; e[tot].full=z; } int dis[3005],g[3005],flow[3005]; bool vis[3005]; int bfs(int s,int t){ queue<int>q; dis[s]=0; q.push(s);vis[s]=true; while(!q.empty()){ int u=q.front();vis[u]=false;q.pop();

「网络流 24 题」试题库

╄→尐↘猪︶ㄣ 提交于 2020-01-22 01:26:51
#include<bits/stdc++.h> using namespace std; int k,n; int tot=-1,h[3005],ans=0,sum=0; struct node{ int from,next,to,rest,full; }e[100005]; void add(int x,int y,int z){ tot++; e[tot].next=h[x]; h[x]=tot; e[tot].from=x; e[tot].to=y; e[tot].rest=z; e[tot].full=z; } int dis[3005],g[3005],flow[3005]; bool vis[3005]; int bfs(int s,int t){ queue<int>q; dis[s]=0; q.push(s);vis[s]=true; while(!q.empty()){ int u=q.front();vis[u]=false;q.pop(); for(int i=h[u];i!=(-1);i=e[i].next){ if(dis[e[i].to]>dis[u]+1&&g[e[i].to]==(-1)&&e[i].rest>0){ g[e[i].to]=i; flow[e[i].to]=min(flow[u],e[i].rest); dis[e[i].to]

「网络流 24 题」方格取数

自闭症网瘾萝莉.ら 提交于 2020-01-22 01:25:39
嘛,你把图分类一下 分成横坐标+纵坐标为奇偶... 然后在图上跑一个二分图最大权匹配 然后就是max(ans, 全部的-ans) 我代码写得有点... 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int inf=9999999; 5 int m,n,h[30005],tot=(-1),ans=0,sum=0; 6 int tu[305][305]; 7 struct node{ 8 int from,to,next,rest; 9 }e[300005]; 10 11 int zb(int x,int y){ 12 return (x-1)*n+y; 13 } 14 15 void add(int x,int y,int z){ 16 tot++; 17 e[tot].next=h[x]; 18 h[x]=tot; 19 e[tot].from=x; 20 e[tot].to=y; 21 e[tot].rest=z; 22 } 23 24 int dis[3005],g[3005],flow[3005]; 25 bool vis[3005]; 26 27 int bfs(int s,int t){ 28 queue<int>q; 29 dis[s]=0; 30 q.push(s);vis[s]=true; 31 while

「网络流 24 题」圆桌聚餐

六月ゝ 毕业季﹏ 提交于 2020-01-22 01:19:38
网络流水题,详细看代码 1 #include<bits/stdc++.h> 2 using namespace std; 3 4 int n,m,tot=-1,h[3005],ans=0,sum=0; 5 struct node{ 6 int from,next,to,rest,full; 7 int last; 8 }e[100005]; 9 void add(int x,int y,int z){ 10 tot++; 11 e[tot].next=h[x]; 12 h[x]=tot; 13 e[tot].from=x; 14 e[tot].to=y; 15 e[tot].rest=z; 16 e[tot].full=z; 17 } 18 19 int dis[3005],g[3005],flow[3005]; 20 bool vis[3005]; 21 22 int bfs(int s,int t){ 23 queue<int>q; 24 dis[s]=0; 25 q.push(s);vis[s]=true; 26 while(!q.empty()){ 27 int u=q.front();vis[u]=false;q.pop(); 28 for(int i=h[u];i!=(-1);i=e[i].next){ 29 if(dis[e[i].to]>dis[u]+1&&g[e