首页 > 其他分享 >网络流学习笔记

网络流学习笔记

时间:2024-02-22 11:11:06浏览次数:38  
标签:vst 增广 int 网络 笔记 学习 edge que wi

零、基本概念

直接走 OIwiki 或者看蓝书吧。


一、Ford-Fulkerson 增广

“该方法运用贪心的思想,通过寻找增广路来更新并求解最大流。”

主要流程就是每次选一些增广路,以来更新最大流。但这个贪心思路不一定能保证正确性。Ford-Fulkerson 增广的核心技术是通过设置 反向边 来实现反悔贪心。

反向边的特性:流量与正向边互为相反数,且始终不大于零。

以下的 Edmonds-Karp、Dinic 和 ISAP 都是基于 Ford-Fulkerson 增广的算法。


二、Edmonds-Karp

基本流程:每次用 Bfs 选择边数最少的一条增广路,如此反复,直到没有增广路。

可以证明,增广总轮数的上界为 \(O(nm)\),单次 Bfs 的时间复杂度为 \(O(m)\),因此总复杂度为 \(O(nm^2)\)。

点击查看代码
#include<bits/stdc++.h>
#define ll long long
using namespace std;

const int MAXN = 205, MAXM = 5005;
int n, m, s, t, head[MAXN], pre[MAXN];
ll f[MAXN], maxflow;
bool vst[MAXN];

struct node{
	int to, nxt;
	ll wi;
} edge[MAXM*2];

inline void Add_edge(int i, int from, int to, int wi){
	edge[i].to = to;
	edge[i].wi = wi;
	edge[i].nxt = head[from];
	head[from] = i;
	return;
}

inline bool Bfs(){
	memset(vst, false, sizeof(vst));
	memset(f, 0x3f3f, sizeof(f));//f:到当前节点为止,增广路上的最小边 
	queue<int> que; que.push(s); vst[s] = true;
	while(!que.empty()){
		int cur = que.front(); que.pop();
		for(int i = head[cur]; i; i = edge[i].nxt){
			if(!edge[i].wi)			continue;
			int to = edge[i].to;
			if(vst[to])				continue;
			f[to] = min(f[cur], edge[i].wi); 
			pre[to] = i;
			vst[to] = true;
			que.push(to);
			if(to == t)	return true;
		}
	}
	return false;
}

inline void Update(){
	for(int x = pre[t]; x; x = pre[edge[x^1].to])
		edge[x].wi -= f[t], edge[x^1].wi += f[t];
	maxflow += f[t];
	return;
}

int main(){
	scanf("%d%d%d%d", &n, &m, &s, &t);
	for(int i = 1; i <= m; i++){
		int ui, vi, wi;				scanf("%d%d%d", &ui, &vi, &wi);
		Add_edge(i*2, ui, vi, wi);	Add_edge(i*2+1, vi, ui, 0);
	}
	while(Bfs())	Update();
	cout<<maxflow;
	
	return 0;
}

二、Dinic 算法

标签:vst,增广,int,网络,笔记,学习,edge,que,wi
From: https://www.cnblogs.com/David-Mercury/p/18026899

相关文章

  • 基础知识-网络部分
    资料参考计算机网络概述网络分层模型网络连接错误举例物理层故障:网线断了、网线发包接口连通但收包接口断了数据链路层故障:MAC冲突、ADSL欠费、网速协商不一致、连接到错误的VLAN网络层故障:配错IP、配错网关、配错DNS、配错子网掩码、路由器找不到路由应用层故障:配置......
  • 神经网络优化篇:详解TensorFlow
    TensorFlow先提一个启发性的问题,假设有一个损失函数\(J\)需要最小化,在本例中,将使用这个高度简化的损失函数,\(Jw=w^{2}-10w+25\),这就是损失函数,也许已经注意到该函数其实就是\({(w-5)}^{2}\),如果把这个二次方式子展开就得到了上面的表达式,所以使它最小的\(w\)值是5,但假设不知道......
  • 2024.02《高效学习法》
     背口诀、划重点、反复温习……各种方法都试过了,可为什么学习成绩还是没有提高呢?其实,你不是不会学习,而是不知道正确的学习方法!日本学习之神DaiGo公开自己独创并长年使用、科学有效、实践性极高的学习秘籍:想象自己把学习内容输出到10岁的孩子都能听懂、不写学习目标而写你掌......
  • MarkDown学习
    MarkDown学习标题一级标题#+空格+标题二级标题##+空格+标题...六级标题######+空格+标题字体helloworldhelloworldhelloworldhelloworld**helloworld** 加粗*helloworld* 斜体***helloworld*** 斜体加粗~~helloworld~~ 删除线引用这个是引用......
  • 掌握云容器网络:何为ipvs
    本文分享自华为云社区《【理解云容器网络】2-基础篇-ipvs介绍》,作者:可以交个朋友。IPVS简介ipvs是工作在Linux内核态的4层负载均衡;和用户态的负载均衡软件(如nginx、haproxy)功能类似:作为客户端访问的统一入口并将访问请求根据调度算法转给后端真实的服务器。相比于用户态负载......
  • 【学习笔记】关于数论与平面几何的一切
    快速幂人话求\(a\)的\(n\)次方,其实就是根据二进制唯一分解定理给\(a^n\)拆成\(\log{n}\)个\(a^{2^i}\),递推求出从\(a^0\)到\(a^{2^i}\)每个数,如果\(n\)的二进制第\(i\)位为1,则将答案乘上\(a^{2^i}\)llQpow(lla,llb){//一开始a就是a的一次方llans=1;while(b......
  • Go语言精进之路读书笔记第32条——了解goroutine的调度原理
    Go的运行时负责对goroutine进行管理,所谓的管理就是“调度”。调度就是决定何时哪个goroutine将获得资源开始执行,哪个goroutine应该停止执行让出资源,哪个goroutine应该被唤醒恢复执行等。32.1goroutine调度器将goroutine按照一定算法放到CPU上执行的程序就称为goroutine调度器(g......
  • Keras深度强化学习--DPG与DDPG实现
    DQN系列算法对连续空间分布的action心有余而力不足,而PolicyGradient系列的算法能够有效的预测连续的动作。在此基础上DPG和DDPG算法被提了出来,并且能够有效地处理连续动作问题。Paper:DPG:DeterministicpolicygradientalgorithmsDDPG:ContinuousControlwithDeepReinforce......
  • 董英杰老师谈如何学习太极拳
    董英杰老师谈如何学习太极拳1、明确“太极”是什么?董先生说:“道经云,一阴一阳谓之道,太极即阴阳也。”所以他认为练太极拳的人,“举手投足,务必注意一阴一阳,一虚一实。”2、太极拳是什么?董先生说:“太极拳本系武当内功”。“太极十三势,本为导引功夫。导引者,导引气血也。”。“十......
  • 网络安全事件管理
    一、背景信息化技术的迅速发展已经极大地改变了人们的生活,网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题,构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。国内外的安全事件在不断增长,安全信息管理市场也在不断发......