首页 > 其他分享 >【模板】网络最大流 Dinic(多路增广+当前弧优化)

【模板】网络最大流 Dinic(多路增广+当前弧优化)

时间:2023-01-20 19:56:14浏览次数:43  
标签:ch 增广 int ll flow char dep Dinic 模板

#include <bits/stdc++.h>
using namespace std;

const int N=5e5+5;
const int M=1e6+5;
const int MN=1e3+5;
typedef long long ll;

inline int read(){int x(0), f(0); char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();} return f?-x:x;}
template <typename T> void read(T &x){x=0; T f(0); char ch=getchar(); while(ch<'0'||ch>'9'){f|=ch=='-';ch=getchar();} while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48); ch=getchar();} x=f?-x:x;}
template <typename T,typename ...Arg>void read(T& x,Arg& ...arg){read(x);read(arg...);}
template <typename T> inline void write(T x){static char buf[64]; static int tot(0); if(x<0) putchar('-'),x=-x; do buf[++tot]=(x%10)+48,x/=10; while(x); do putchar(buf[tot--]); while(tot);}
template <typename T> void write(T x,char c){static char buf[64]; static int tot(0); if(x<0) putchar('-'),x=-x; do buf[++tot]=(x%10)+48,x/=10; while(x); do putchar(buf[tot--]); while(tot); putchar(c);}

void Solve();

struct Graph{
    int to, next;
    ll w;
}G[M << 1];
int _head[N], cur[N], cnt(1);
void addEdge(int u,int v,int w = 1){G[++cnt] = (Graph){v, _head[u], w}; _head[u] = cnt;}

int n,m,s,t;

int main(){
//    Multicase()
        Solve();
}

int dep[N],que[N];

bool bfs(){
	memcpy(cur+1, _head+1, (n + 5) * sizeof(cur[0]));
	memset(dep, 0, (n + 5) * sizeof(dep[0]));
	dep[s] = 1;
	int head = 1, tail = 0; que[++tail] = s;
	while(tail >= head){
		int u = que[head++];
		for(int i = _head[u]; i; i = G[i].next){
			int t = G[i].to;
			if(G[i].w && !dep[t]){
				dep[t] = dep[u] + 1;
				que[++tail] = t;
			}
		}
	}
	return dep[t];
}

ll dfs(int now, ll flow){
	ll tot = 0, f = 0;
	if(now == t || flow == 0) return flow;
	for(int i = cur[now]; i; i = G[i].next){
		cur[now] = i;
		int t = G[i].to;
		if(G[i].w && dep[t] == dep[now] + 1){
			if(f = dfs(t, min(flow, G[i].w))){
				G[i].w -= f;
				G[i ^ 1].w += f;
				tot += f;
				flow -= f;
				if(flow == 0) break;
			}
		}
	}
	return tot;
}

ll dinic(){
	ll maxflow = 0;
	while(bfs()) maxflow += dfs(s, 1<<30); 
	return maxflow;
}

void Solve(){
	read(n, m);
	s = 1, t = n;
	for(int i = 1; i <= m; i++){
		int u, v, w;
		read(u, v, w);
		addEdge(u, v, w);
		addEdge(v, u, 0);
	}
	printf("%lld\n", dinic());
}

标签:ch,增广,int,ll,flow,char,dep,Dinic,模板
From: https://www.cnblogs.com/DataErr0r/p/17063083.html

相关文章

  • vue.js客服系统实时聊天项目开发(七)ES6模板字符串进行字符串变量内嵌拼接
    在开发客服系统的时候进行字符串拼接的太多,可以使用模板字符串处理你可以使用ES6中的模板字符串来实现这个功能。模板字符串是用反引号(`)括起来的字符串,其中变量可以使用${......
  • 高精模板
    #include<algorithm>usingstd::min;usingstd::max;typedefunsignedlonglongull;typedeflonglongll;constexprullBASE=100000000;constexprunsignedL......
  • 07-模板模式
    07-模板模式概念模板模式是一种常见的设计模式,在实现中经常可以看到,具体的使用场景为:整体流程大致相同,其中有部分方法实现不同。例子本文给出《大话设计模式》书中的例......
  • vue项目中components组件(模板)的使用和传值
    在项目开发过程中,我们经常会遇到重复代码结构,比如页面的头部、底部等,通常我们都是作为模板或者公共文件进行设计使用,在vue中,我们可以使用components组件(模板)来实现。下面我......
  • c++基础篇之C++ 模板
    C++模板模板是泛型编程的基础,泛型编程即以一种独立于任何特定类型的方式编写代码。模板是创建泛型类或函数的蓝图或公式。库容器,比如迭代器和算法,都是泛型编程的例子,它们都......
  • 【转载】回复“大修意见”(Major Revision)的模板 —— 审稿意见回复模板
    原文地址:https://zhuanlan.zhihu.com/p/80214252  ==================================================   上周有个小伙伴问有没有大修意见(MajorRevision)的......
  • 设计模式之模板方法模式和策略模式
    今天看了雷神的公开课,再次学习了设计模式的五个原则以及两个设计模式的应用案例模板方法模式:定义一个算法骨架(一套业务流程),子类可以实现里面的一个或多个步骤eg:对于Spr......
  • 第五章:模板层
    模板层模板语法传值{{}}:传变量相关的值,如:整型、列表、字典、函数等等{%%}:传逻辑相关的值,如:for循环、if判断、static动态解析等等传递基本数据类型整型、浮点型、......
  • C#-使用模板导出Word文件
    记录下使用C#+Word模板导出Word文件的方法。首先建立Word文件模板,需要填写的地方用占位符替代,比如姓名处:name,年龄处:age....首先引入命名空间:usingword=Microsoft......
  • C++ 可变参模板
    求多个数的最小值template<typenameT,typename...Ts>constexprautomin(constT&a,constT&b,constTs&...ts){constautom=a<b?a:b;ifco......