首页 > 其他分享 >网络最大流(模板)

网络最大流(模板)

时间:2024-02-22 12:24:17浏览次数:25  
标签:nxt cnt 最大 val int 网络 head 模板 dis

不加弧优化

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10005;
int n, m, s, t;
struct edge {int v, nxt, val;} e[N * 2];
int head[N], cnt = 1;
int dis[N];
int maxflow;
void add(int u, int v, int val) {
	e[++cnt].val=val;
	e[cnt].v=v;
	e[cnt].nxt=head[u];
	head[u] = cnt;
	
	e[++cnt].val=0;
	e[cnt].v=u;
	e[cnt].nxt=head[v];
	head[v] = cnt;
}
bool bfs() {
	queue<int>q;
	memset(dis, -1, sizeof(dis));
	q.push(s);
	dis[s] = 1;
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (int i = head[x]; i; i = e[i].nxt) {
			int v = e[i].v;
			if (dis[v] == -1 && e[i].val) {
				q.push(v);
				dis[v] = dis[x] + 1;
			}
		}
	}
	return dis[t] != -1;
}
int dfs(int u, int flow) {
	if (u == t) return flow;
	int res = 0;
	for (int i = head[u]; i; i = e[i].nxt) {
		int v = e[i].v;
		if (dis[v] == dis[u] + 1 && e[i].val) {
			int fl = dfs(v, min(e[i].val, flow));
			if (fl) {
				e[i].val -= fl;
				e[i ^ 1].val += fl;
				flow -= fl;
				res += fl;
				if (!flow) return res;
			}
		}
	}
	return res;
}
signed main() {
	scanf("%lld%lld%lld%lld", &n, &m, &s, &t);
	for (int i = 1; i <= m; ++i) {
		int x, y, val;
		scanf("%lld%lld%lld", &x, &y, &val);
		add(x, y, val);
	}
	while (bfs()) maxflow += dfs(s, 1 << 29);
	cout << maxflow;
	return 0;
}

加弧优化

  #include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 10005;
int n, m, s, t;
struct edge {int v, nxt, val;} e[N * 2];
int head[N], cnt = 1;
int dis[N];
int cur[N];//弧优化数组
int maxflow;
void add(int u, int v, int val) {
	e[++cnt].val=val;
	e[cnt].v=v;
	e[cnt].nxt=head[u];
	head[u] = cnt;
	
	e[++cnt].val=0;
	e[cnt].v=u;
	e[cnt].nxt=head[v];
	head[v] = cnt;
}
bool bfs() {
	queue<int>q;
	for(int i=1;i<=n;i++){
		dis[i]=-1;
		cur[i]=head[i];
	}
	q.push(s);
	dis[s] = 1;
	while (!q.empty()) {
		int x = q.front();
		q.pop();
		for (int i = head[x]; i; i = e[i].nxt) {
			int v = e[i].v;
			if (dis[v] == -1 && e[i].val) {
				q.push(v);
				dis[v] = dis[x] + 1;
			}
		}
	}
	return dis[t] != -1;
}
int dfs(int u, int flow) {
	if (u == t) return flow;
	int res = 0;
	for (int i = cur[u]; i; i = e[i].nxt) {
		cur[u]=i;
		int v = e[i].v;
		if (dis[v] == dis[u] + 1 && e[i].val) {
			int fl = dfs(v, min(e[i].val, flow));
			if (fl) {
				e[i].val -= fl;
				e[i ^ 1].val += fl;
				flow -= fl;
				res += fl;
				if (!flow) return res;
			}
		}
	}
	return res;
}
signed main() {
	scanf("%lld%lld%lld%lld", &n, &m, &s, &t);
	for (int i = 1; i <= m; ++i) {
		int x, y, val;
		scanf("%lld%lld%lld", &x, &y, &val);
		add(x, y, val);
	}
	while (bfs()) maxflow += dfs(s, 1 << 29);
	cout << maxflow;
	return 0;
}

标签:nxt,cnt,最大,val,int,网络,head,模板,dis
From: https://www.cnblogs.com/wenzhihao2023/p/18027044

相关文章

  • 网络流学习笔记
    零、基本概念直接走OIwiki或者看蓝书吧。一、Ford-Fulkerson增广“该方法运用贪心的思想,通过寻找增广路来更新并求解最大流。”主要流程就是每次选一些增广路,以来更新最大流。但这个贪心思路不一定能保证正确性。Ford-Fulkerson增广的核心技术是通过设置反向边来实现反......
  • 基础知识-网络部分
    资料参考计算机网络概述网络分层模型网络连接错误举例物理层故障:网线断了、网线发包接口连通但收包接口断了数据链路层故障:MAC冲突、ADSL欠费、网速协商不一致、连接到错误的VLAN网络层故障:配错IP、配错网关、配错DNS、配错子网掩码、路由器找不到路由应用层故障:配置......
  • 神经网络优化篇:详解TensorFlow
    TensorFlow先提一个启发性的问题,假设有一个损失函数\(J\)需要最小化,在本例中,将使用这个高度简化的损失函数,\(Jw=w^{2}-10w+25\),这就是损失函数,也许已经注意到该函数其实就是\({(w-5)}^{2}\),如果把这个二次方式子展开就得到了上面的表达式,所以使它最小的\(w\)值是5,但假设不知道......
  • 掌握云容器网络:何为ipvs
    本文分享自华为云社区《【理解云容器网络】2-基础篇-ipvs介绍》,作者:可以交个朋友。IPVS简介ipvs是工作在Linux内核态的4层负载均衡;和用户态的负载均衡软件(如nginx、haproxy)功能类似:作为客户端访问的统一入口并将访问请求根据调度算法转给后端真实的服务器。相比于用户态负载......
  • 网络安全事件管理
    一、背景信息化技术的迅速发展已经极大地改变了人们的生活,网络安全威胁也日益多元化和复杂化。传统的网络安全防护手段难以应对当前繁杂的网络安全问题,构建主动防御的安全整体解决方案将更有利于防范未知的网络安全威胁。国内外的安全事件在不断增长,安全信息管理市场也在不断发......
  • 代码随想录 day57 最长公共子序列 不相交的线 最大子数组和
    最长公共子序列dp[i][j]:长度为[0,i-1]的字符串text1与长度为[0,j-1]的字符串text2的最长公共子序列为dp[i][j]主要就是两大情况:text1[i-1]与text2[j-1]相同,text1[i-1]与text2[j-1]不相同如果text1[i-1]与text2[j-1]相同,那么找到了一个公共元素,所以dp......
  • 第十八节:动态规划面试题(爬楼梯、买卖股票时机、最大子数组和)
    一.        二.        三.         !作       者:Yaopengfei(姚鹏飞)博客地址:http://www.cnblogs.com/yaopengfei/声     明1:如有错误,欢迎讨论,请勿谩骂^_^。声     明2:原创博客请在转载......
  • 33: 三个数的最大值
    题目描述有三个整数abc,由键盘输入,输出其中的最大的数。 输入一行数组,分别为abc 输出abc其中最大的数 输入样例102030 输出样例30 分析和代码根据题意编写代码即可#include<bits/stdc++.h>usingnamespacestd;intmain(){inta,......
  • SDWAN组网是怎么降低网络搭建成本
    在当今数字化时代,企业的网络架构扮演着至关重要的角色,直接影响到业务的高效运转和信息的安全传输。然而,传统的网络架构往往伴随着高昂的搭建和维护成本,对于许多企业来说是一个不小的负担。而SD-WAN组网作为一种新型的网络架构技术,为企业降低网络搭建成本提供了良好的解决方案。 ......
  • VMWare的虚拟网络编辑器
    一、VMWare的虚拟网络编辑器功能VMware的虚拟网络编辑器(VirtualNetworkEditor)是一个工具,用于管理和配置VMware虚拟网络适配器和网络设置。通过虚拟网络编辑器,用户可以对虚拟网络进行高级配置,包括网络适配器类型、IP地址分配、子网设置、端口映射等。以下是虚拟网络编辑器的......