【笔记】网络流——从入门到疏散

数模时现学的网络流,当时忘了发


网络流初步

参考资料:紫书11.4

最大流

  1. 想要把一些东西从s(源点)运到t(汇点),可以从中间节点中转。
  2. 对于一条边,物品上限称为容量 c c c,实际运送的物品称为流量 f f f
  3. 基本性质:
    1. 容量限制: f ( u , v ) < = c ( u , v ) f(u,v)<=c(u,v) f(u,v)<=c(u,v)
    2. 斜对称性: f ( u , v ) = − f ( v , u ) f(u,v)=-f(v,u) f(u,v)=f(v,u)
    3. 流量平衡:除s和t外的任意节点u,v, Σ u , v ∈ E f ( u , v ) = 0 \Sigma_{u,v\in E}f(u,v)=0 Σu,vEf(u,v)=0
  4. 最大流问题目标:
    最大化 ∣ f ∣ = Σ s , v ∈ E f ( s , v ) = Σ u , t ∈ E f ( u , t ) |f|=\Sigma_{s,v\in E}f(s,v)=\Sigma_{u,t\in E}f(u,t) f=Σs,vEf(s,v)=Σu,tEf(u,t),即从s流出的净流量。

增广路算法

  1. 每条边上容量与流量之差称为残量。有向残量边(正反都有)组成的图称为残量网络
  2. 残量网络中任何一条从s到t的有向道路都对应一条原图中的增广路。只要求出道路中所有残量的最小值d,把对应的所有边上流量增加d即可,这个过程称为增广
  3. 当且仅当残量网络中不存在s-t有向道路(增广路)时,此时的流是从s到t的最大流。
  4. 找路径的Edmonds-Karp算法,每次使用bfs增广。

最小割最大流定理

  1. 最小割问题:把所有定顶点分成两个集合,成为一个割。两个集合间的边权和(称为容量)最小的割称为最小割。
  2. 如果s和t分别在两个集合S和T中,那么S和T组成的割叫做s-t割。记它的容量为 c ( S , T ) c(S,T) c(S,T)
  3. 对于任意s-t流f和任意s-t割(S,T),有 ∣ f ∣ ≤ c ( S , T ) |f|\leq c(S,T) fc(S,T).
  4. 在增广路算法结束时,把已标号节点看成S,T=V-S,则f是s-t最大流,(S,T)是s-t最小割,且 ∣ f ∣ = c ( S , T ) |f|=c(S,T) f=c(S,T),即最小割等于最大流。

最小费用最大流

  1. 每条边除了容量限制外还有一个单位流量所需的费用。
  2. 需要考虑平行边。
  3. 简单算法:找到初始最小费用可行流,每次用Bellman-Ford增广后的新流都是新流量下的最小费用流。

网络流

参考资料:蓝书5.6

最短增广路算法

  1. 每次沿着最短增广路(边数最少的增广路)进行增广,最多只需要 O ( n m ) O(nm) O(nm)次增广。
  2. 效率取决于每次查找最短增广路的效率,Edmonds-Karp算法使用bfs查找,每次 O ( m ) O(m) O(m),总时间复杂度 O ( n m 2 ) O(nm^2) O(nm2)
  3. 实现-弧数据结构
    Edge{
    	int from, to, cap, flow;
    }
    
    表示一条从from到to,容量为cap,流量为flow的弧。当且仅当flow 当cap为0时,意味着此边是反向弧,此时flow<=0;
    void addEdge(int from,int to,int cap)
    {
    	edges.push_back(Edge({from,to,cap,0}));
    	edges.push_back(Edge({to,from,0,0}));
    	m = edges.size();
    	G[from].push_back(m-2);
    	G[to].push_back(m-1);
    }
    
    原图中的一条弧对应于两个Edge,且相异或的项或为反向弧。

Dinic算法

  1. 使用BFS构造层次图,使用阻塞流增广。
  2. 层次图:包括残量网络中节点以及所有满足dist(u)+1=dist(v)的边u,v。层次图中每一条路径都是s-t最短路。
  3. 阻塞流:不考虑反向弧时的“极大流”,即在层次图中dfs找到一条路就增广。
  4. 时间复杂度:最多计算n-1次阻塞流,每次计算时间不超过 O ( m n ) O(mn) O(mn),总时间复杂度 O ( n 2 m ) O(n^2m) O(n2m),实际远小于这个界。

ISAP算法

留坑

最小费用最大流算法

代码留坑

网络流模型

  1. 多源多汇问题:多个源点多个汇点,流可以从任意源流出流向任意汇,总流量为所有源流出的总流量之和。
    添加超级源点s’与超级汇点t’,从s’向每个源引一条有向弧,每个汇向t’引一条弧,容量均为无穷大。
  2. 节点容量:每个节点都有允许通过的最大流量。
    把每个节点u分裂成两个节点u1和u2,中间连一条容量等于节点容量的有向弧。把u的入弧连到u1,出弧从u2开始。
  3. 无源无汇有容量下界网络的可行流:留坑。
  4. 有容量下界网络的s-t最大/最小流:留坑。
  5. 费用与流量平方成正比的最小费用最大流:留坑。
  6. 流量不固定的s-t最小费用流:留坑!

单源多出口建筑物突发事件应急疏散模型和算法

问题假设

  1. 多个出口,每个出口有容量限制。(这应该连一条到超级汇的边就行吧)
  2. 每段弧有容量限制
  3. 待疏散人员在各条弧上具有平均的步行速度,即每条弧上的行走时间取决于路径长度

符号

  1. G(V,E)-疏散网络;V-节点集;E-弧集;
  2. t i j t_{ij} tij表示经过弧 e i j 的 所 需 时 间 e_{ij}的所需时间 eij c i j c_{ij} cij-弧 e i j 单 位 时 间 内 的 最 大 容 量 e_{ij}单位时间内的最大容量 eij
  3. x − 人 员 总 数 x-人员总数 x
  4. D C k − 第 k 个 出 口 单 位 时 间 内 允 许 通 过 的 最 大 容 量 DC_k-第k个出口单位时间内允许通过的最大容量 DCkk
  5. 等等

你可能感兴趣的:(学习笔记,精选)