首页 > 其他分享 >最大流学习笔记

最大流学习笔记

时间:2024-02-29 11:24:29浏览次数:34  
标签:bfs cnt 205 最大 int 笔记 学习 hd dis

(该笔记用于复习,请不要用此学习)
最大流问题
对于输入的一个有向图,对于一条边(u,v,w),我们建立一个图包含(u,v,w)和(v,u,0)
dinic算法的步骤:
1.对当前图进行bfs(只有边权>0的可以走),找到源点到每个点的最短路
2.判断源点是否可以走到汇点(bfs完直接判断即可)
可以->下一步
不可以->返回当前流量,结束
3.对图进行dfs,找到增广路
4.回到步骤1
模板

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int inf=1e9;
int n,m,s,t;
struct edge{
	int v,w,nx;
}e[10005];
int cnt,hd[205],cur[205];
void add(int u,int v,int w){
	e[++cnt]=edge{v,w,hd[u]};
	hd[u]=cnt;
}
int dis[205];
bool bfs(){
	queue<int> q;q.push(s);
	memset(dis,0x3f,sizeof(dis));dis[s]=0;
	for(int i=1;i<=n;i++)cur[i]=hd[i];
	while(!q.empty()){
		int u=q.front();q.pop();
		for(int i=hd[u];i;i=e[i].nx){
			int v=e[i].v;if(e[i].w<=0 || dis[v]<=dis[u]+1)continue;
			dis[v]=dis[u]+1;
			q.push(v);
		}
	}
	return dis[t]!=0x3f3f3f3f;
}
inline int rev(int id){
	if(id&1)return id+1;
	else return id-1;
}
ll dfs(int u,int sum){
	if(u==t)return sum;
	ll res=0;
	for(int i=cur[u];i;i=e[i].nx){
		cur[u]=i;
		int v=e[i].v;if(e[i].w<=0 || dis[v]!=dis[u]+1)continue;
		int p=dfs(v,min(sum,e[i].w));
		if(p==0)dis[v]=0x3b800001;
		e[i].w-=p;e[rev(i)].w+=p;
		res+=p;sum-=p;
	}
	return res;
}
ll dinic(){
	ll res=0;
	while(bfs())res+=dfs(s,inf);
	return res;
}
int main(){
	scanf("%d%d%d%d",&n,&m,&s,&t);
	for(int i=1;i<=m;i++){
		int u,v,w;scanf("%d%d%d",&u,&v,&w);
		add(u,v,w);add(v,u,0);
	}
	printf("%lld\n",dinic());
	return 0;
}

标签:bfs,cnt,205,最大,int,笔记,学习,hd,dis
From: https://www.cnblogs.com/kentsbk/p/18043040

相关文章

  • 实战上,通过一段ID 生成器代码,学习如何发现,代码质量的问题(设计模式)
    ID生成器的需求背景介绍ID中文翻译为标识Identifier,这个概念在生活,工作中随处可见,比如身份证、商业条形码、二维码、车牌号、驾照号。聚焦到软件开发中,ID常用来标识一些业务信息的唯一标识,比如订单的单号或者数据库中的唯一主键,比如地址中ID字段(实际上时没有业务含义的,对用......
  • 扣子(coze.cn)| 由浅入深,手把手带你实现Java转型学习助手
    扣子(coze.cn)是一款用来开发新一代AIChatBot的应用编辑平台,无论你是否有编程基础,都可以通过这个平台来快速创建各种类型的ChatBot,并将其发布到各类社交平台和通讯软件上!2月1日,扣子国内版已经正式上线啦~赶快来体验一下吧!一转眼,ChatGPT已经在AI界炙手可热超过一年,堪称新晋......
  • 深度学习-卷积神经网络-tensorflow的用法-49
    目录1.01_first_graph2.sessionrun3.global_variables_initializer4.InteractiveSession5.get_default_graph6.life_cicycle07linear_regression8.manual_gradient9.auto_diff12.softmax_regression13.convolution14.pooling1.01_first_graphimporttensorflowa......
  • 组合数学 学习笔记
    1.几个组合恒等式\((1)C_n^m=C_n^{n-m}\)\((2)\sum\limits_{i=0}^{\min(n,m,k)}{C_n^i\timesC_m^{k-i}}=C_{n+m}^k\)\((3)\sum\limits_{i=0}^nC_n^i=2^n\)\((4)\sum\limits_{i=0}^n{c_n^i\timesi}=n\times2^{n-1}\)\((5)\sum\limits_{i=0}^{n}{C......
  • 树状数组学习笔记
    目录原理(结构)建树应用单点修改,区间求和区间修改,单点求值区间修改,区间求和单点修改,区间求最值求逆序对个数二维树状数组trick:树状数组上倍增权值树状数组正文1.原理引用日报图片。设黑色框内数组为\(a_1\toa_8\).可以推得\(c_i=a_......
  • cdq分治学习笔记
    简介cdq分治通过分治的思想可以在\(O(n\log^2n)\)的时间内(常数极小)解决如下问题:解决和点对有关的问题/解决偏序问题(三维偏序,动态逆序对)优化dp(拦截导弹)将动态问题转化为静态问题(城市建设)一.解决和点对有关的问题这种问题的通常表述:给定长度为\(n\)的序列,多次......
  • 前端学习-vue学习003-事件监听
    教程链接使用v-on指令监听DOM事件<buttonv-on:click="increment">{{count}}</button>简写语法<button@click="increment">{{count}}</button><scriptsetup>import{ref}from'vue'constcount=ref(0)......
  • FHQ-treap学习笔记
    平衡树,即平衡二叉搜索树。二叉搜索树(BST),它或者是一棵空树,或者是具有下列性质的二叉树:若它的左子树不空,则左子树上所有结点的值均小于它的根结点的值;若它的右子树不空,则右子树上所有结点的值均大于它的根结点的值;它的左、右子树也分别为二叉排序树。(from百度百科)而在使用这种......
  • 搜索 学习笔记
    目录最基础的搜索1.1bfs1.2dfs双向搜索2.1双向广搜2.2双向宽搜2.3meetinthemiddle3搜索的优化3.1记忆化搜索3.2最优性剪枝3.3可行性剪枝3.4其他方法迭代加深搜索DancingLinks\(\alpha-\beta\)剪枝A/IDA正文1.最基础的搜索......
  • 机器学习策略篇:详解满足和优化指标(Satisficing and optimizing metrics)
    满足和优化指标要把顾及到的所有事情组合成单实数评估指标有时并不容易,在那些情况里,发现有时候设立满足和优化指标是很重要的,让我告诉是什么意思吧。假设已经决定很看重猫分类器的分类准确度,这可以是\(F_1\)分数或者用其他衡量准确度的指标。但除了准确度之外,还需要考虑运行时......