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

网络流学习笔记

时间:2023-01-12 15:23:44浏览次数:52  
标签:head level int 子图 网络 tot 学习 edge 笔记

我承认了,我粘的 LiveDream Classin里的图!
我没学费用流!

一·网络最大流

1.\(EK\)

这个只是铺垫(

https://oi-wiki.org/graph/flow/max-flow/

2.\(Dinic -> O(n^2m)\)

当多条增广路有很长一部分的公共路径时,\(EK\) 效率不高

如何使一条路只搜一次?

将经过节点 \(x\) 的所有增广路一次搜完

实现:

  • 利用BFS将有向图分层,达到每次走最短路的目的
  • 利用DFS的回溯特点,将一个点 \(x\) 之后的所有增广路全部搜完

我的 \(Dinic:\)

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,s,t,head[200005],nxt[200005],edge[200005],to[200005],pre[100005],level[100005];
int tot;
void add(int u,int v,int w){
	to[++tot]=v;
	edge[tot]=w;
	nxt[tot]=head[u];
	head[u]=tot;
	to[++tot]=u;
	edge[tot]=0;
	nxt[tot]=head[v];
	head[v]=tot;
}
bool bfs(){
	memset(level,0,sizeof(level));
	queue<int>q;
	level[s]=1;
	q.push(s);
	while(!q.empty()){
		int cur=q.front();
		q.pop();
		for(int i=head[cur];i;i=nxt[i]){
			if(edge[i]&&!level[to[i]]){
				q.push(to[i]);
				level[to[i]]=level[cur]+1;
				if(to[i]==t)return 1;
			}
		}
	}
	return 0;
}
int Dinic(int x,int flow){
	if(x==t)return flow;
	int rest=flow,increase;
	for(int i=head[x];i&&rest;i=nxt[i]){
		int y=to[i];
		if(edge[i]&&level[y]==level[x]+1){
			increase=Dinic(y,min(rest,edge[i]));
			if(!increase)level[y]=0;
			edge[i]-=increase;
			edge[i^1]+=increase;
			rest-=increase;
		}
	}
	return flow-rest;
}
signed main(){
	ios::sync_with_stdio(0);
	cin>>n>>m>>s>>t;
	cin.tie(0);
	cout.tie(0);
	tot=1;
	for(int i=1;i<=m;++i){
		int u,v,w;
		cin>>u>>v>>w;
		add(u,v,w);
	}
	int flow=0,maxflow=0;
	while(bfs())maxflow+=Dinic(s,1000000000);
	cout<<maxflow;
	return 0;
}

最大流中的最小割问题:

使得原点 \(s\) 与 汇点 \(t\) 不连通至少需要删除的边权和。

结论:最小割=最大流(割的和上限边是同一个边)

最大权闭合子图问题

什么是闭合子图?

在有向图G(V,E)中,存在子图G'(V',E'),使得V'中的点
沿着E'到达的顶点x也是V'中的点,那么G'就是G的闭合子图。

什么是最大权闭合子图?

权值在点上,所有闭合子图中,点权和最大的闭合子图

问题雏形

给定 n 种物品,均有价格,m 个组合对应 m 种收益(可重叠,价格只算一次,收益重叠),求最大收益。

建模方法

\(ProblesSet\)

  • \(P2057\)

标签:head,level,int,子图,网络,tot,学习,edge,笔记
From: https://www.cnblogs.com/Forever1507/p/17046757.html

相关文章

  • 从Bug中学习--Bug根因分析法
    来源:http://www.51testing.com/html/31/n-4456831.html一提起测试,大多数人很容易就会联想到Bug。的确,测试的日常工作离不开Bug,测试工作很重要的一部分就是发现Bug。但......
  • 【Python】爬虫笔记-从PyMySQL到DBUtils
    1.PyMySQL1.1基本使用PyMySQL是在Python3.x版本中用于连接MySQL服务器的一个库,Python2中则使用mysqldb。PyMySQL遵循Python数据库APIv2.0规范,并包含了pur......
  • RabbitMQ学习笔记06:Topics
    参考资料:RabbitMQtutorial-Topics—RabbitMQ  前言在上一篇博文中我们使用direct类型的exchange改善了我们的日志系统,但是它仍然有一定的限制,它没有办法基于多个......
  • 【LeetCode】学习计划——SQL入门
    Day1选择595.大的国家World表:+-------------+---------+|ColumnName|Type|+-------------+---------+|name|varchar||continent|varchar......
  • 迁移学习(JDDA) 《Joint domain alignment and discriminative feature learning for un
    论文信息论文标题:Jointdomainalignmentanddiscriminativefeaturelearningforunsuperviseddeepdomainadaptation论文作者:ChaoChen,ZhihongChen,BoyuanJ......
  • Effective C++ 笔记
    EffectiveC++笔记Sec0Introduction本书的目的:如何有效运用C++,使软件易理解、易维护、可移植、可扩充、高效、并有预期行为提出的忠告分两类:一般性的设计策略,带有......
  • 【 随笔】 2023年1月12日 || 接近一个月未更新的学习记录: 开题答辩and旅游
    这段时间完成了两个比较重要的事情 分别是开题答辩和旅游。 因为博客园属于技术分享,所以将开题的大致思路整理一下放到博客上面。     ......
  • 【学习笔记】缓存
    缓存1.什么是缓存缓存是存在内存中的临时数据。将用户经常查询的数据放在缓存(内存)中,用户去查询数据就不用去磁盘(关系型数据库数据文件)上查询,从缓存中查询,从而提高查询效......
  • 【计算机网络-数据链路层】局域网(LAN)
    目录1局域网的概念1.1局域网的拓扑结构1.2局域网的传输介质1.3局域网的介质访问控制方式(MAC)1.4局域网的分类2以太网(Ethernet,IEEE802.3标准)2.1以太网的传输介质2.2......
  • 机器学习流程是什么?简述机器学习流程!
    1、抽象成数学问题明确问题是进行机器学习的第一步。机器学习的训练过程通常都是一件非常耗时的事情,胡乱尝试时间成本是非常高的。这里的抽象成数学问题,指的明确我们可以获......