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

网络流学习笔记

时间:2023-05-04 18:33:29浏览次数:32  
标签:head int 网络 tot 学习 笔记 las include dis

概念

最大流: 在一个网络图上,每个边有流量限制,假如起始点有无线流量,求最多能有多少流量流到终点。

增广路: 一条从起始点到终点了路径,可以流流量。

算法

Ford-Fulkerson算法

解决这个问题,可以用Ford-Fulkerson算法。

该算法的核心就是寻找增广路。每找到一条增广路,就给它它能承受的最多流量。

我们注意到这样是有问题的,很可能最终结果不是最优的。因为先找到的增广路可能导致超过一条增广路断掉,最终答案劣。所以考虑反悔贪心。

反悔操作可以用反向边完成。建立反向边,每次增广路把正向边的流量给到反向边。这样一旦选到反向边,就相当于撤销了一次对边的选择操作,并把两次操作合并。可以证明这是最优的。

dfs爆搜即可。

Dinic算法

Dinic是针对FF的一种优化。

先使用bfs为所有点分层,然后每次dfs爆搜,只需要走层数较高的点,避免搜重和环。

弧优化

基于链式前向星,剪掉无用的dfs过程。分层后因为向回搜索不优,剪掉。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<queue>
#include<vector>
#define int long long
using namespace std;
int tot=1,head[1000001],n,m,st,ed,dis[1000001],now[1000001];
struct node
{
	int to,nex,w;
}e[1000001];
void add(int u,int v,int w)
{
	e[++tot].to=v;
	e[tot].w=w;
	e[tot].nex=head[u];
	head[u]=tot;
	
	e[++tot].to=u;
	e[tot].w=0;
	e[tot].nex=head[v];
	head[v]=tot;
}
bool bfs()
{
	for(int i=1;i<=n;i++)
	{
		dis[i]=10000000000;
	}
	queue<int> q;
	q.push(st);
	dis[st]=0;
	now[st]=head[st];
	while(!q.empty())
	{
		int u=q.front();
		q.pop();
		for(int i=head[u];i;i=e[i].nex)
		{
			int v=e[i].to;
			if(e[i].w>0&&dis[v]==10000000000)
			{
				q.push(v);
				now[v]=head[v];
				dis[v]=dis[u]+1;
				if(v==ed) return true; 
			}
		}
	}
	return false;
}
int dfs(int u,int sum)
{
	if(u==ed) return sum;
	int re=0,las;
	for(int i=now[u];i&&sum;i=e[i].nex)
	{
		now[u]=i;
		int v=e[i].to;
		if(e[i].w>0&&dis[v]==dis[u]+1)
		{
			las=dfs(v,min(sum,e[i].w));
			if(las==0) dis[v]=10000000000;
			e[i].w-=las;
			e[i^1].w+=las;
			re+=las;
			sum-=las;
		}
	}
	return re;
}
signed main()
{
	int ans=0;
	scanf("%lld%lld%lld%lld",&n,&m,&st,&ed);
	for(int i=1,u,v,w;i<=m;i++)
	{
		scanf("%lld%lld%lld",&u,&v,&w);
		add(u,v,w);
	}
	while(bfs())
	{
		ans+=dfs(st,10000000000);
	}
	cout<<ans;
}

标签:head,int,网络,tot,学习,笔记,las,include,dis
From: https://www.cnblogs.com/lizhous/p/17372174.html

相关文章

  • 螣龙天眼ASM的网络空间资产测绘现场演示!网安大会现场直击
    为进一步促进上海市智慧城市建设,助力上海市数字化城市转型的健康发展,同步加强企业的网络安全意识,提高网络安全防护技能,由上海市信息网络安全管理协会主办的《新耀东方2023年大讲堂》公开分享大会,昨日在上海斯格威铂尔曼大酒店圆满落幕。  上海市信息网络安全管理协会的会长......
  • 关于单片机控制电压检测的学习
    1.使用单片机内自带的ADC模块进行检测问题在于频率是否合适:在实验2的基础上得到结论,当两线圈距离在2cm左右时,工作频率将会超过1MHz。采样的最好结果是采集尽可能多的点,这样才能绘制出真正反映实际情况的曲线。目前想要完成的是实验3的demo,采用电阻分压和二极管整流,直接利用......
  • k8s集群-CNI网络插件(Calico 和 Flannel)
    1)部署flannel网络(主节点服务器)在主节点服务器上查看子节点状态为NotReady[root@k8s-master01-15~]#kubectlgetnodeNAMESTATUSROLESAGEVERSIONk8s-master01-15NotReadymaster20mv1.20.11k8s-node01-16NotReady19m......
  • SDN Python编程创建多数据中心网络
    首先开启OpenDaylightcd/home/ubuntu/karaf-0.7.1/bin/./karaf新开一个终端执行以下操作在/home/ubuntu/mininet/examples目录下新建一个sdn4.py文件输入以下代码frommininet.topoimportTopoclassMyTopo(Topo):def__init__(self):Topo.__init......
  • python-Gradio 机器学习演示库
    python-GradioGradio是一个开源的Python库,用于构建机器学习和数据科学演示应用。有了Gradio,你可以围绕你的机器学习模型或数据科学工作流程快速创建一个简单漂亮的用户界面。Gradio适用于以下情况:为客户/合作者/用户/学生演示你的机器学习模型。通过自动共享链接快速部署你的......
  • 学习使用benchmarksql压测数据库
    介绍benchmarksql是一款符合TPC-C基准压力测试工具,TPC-C是衡量在线事务处理的基准。TPC-C模型是模拟一个商品批发公司的销售模型,这个模型涵盖了一个批发公司面向客户对一系列商品进行销售的过程,这包括管理订单,管理库存,管理账号收支等操作。这些操作涉及到仓库、商品、客户、订单......
  • TypeScript 学习笔记 — 模板字符串和类型体操(十五)
    目录基本介绍字符串类型体操实操环节1.字符串首字母大写CapitalizeString2.获取字符串第一个字符FirstChar3.获取字符串最后一个字符LastChar4.字符串转元组StringToTuple5.元组转字符串TupleToString6.重复字符串RepeatString7.字符串分割SplitString8.获取字符串......
  • 网络信息采集工具 “八爪鱼”,无需编写任何代码
    最近老板安排了个需求,想要我统计一下电商平台上的几个竞品的一些数据信息来进行比对,我想这还不简单,爽快就答应下来了说明天给他,没成想老板一个excel甩过来我起初并不在意,一打开我人都傻了整整70多个链接,这我不得整理个两年半?这我当然不干了,我刚想去找老板对线,就被我同事叫住了......
  • SDN 编写Python脚本创建自定义网络拓扑
    编写Python脚本创建自定义网络拓扑,包括5台交换机5台主机frommininet.topoimportTopoclassRingTopo(Topo):def__init__(self):Topo.__init__(self)#Createswitchess_num=5h_num=5switches=[]hosts......
  • react.js学习笔记
    (1)      参考文献1.前端技术手册2.在线编码......