首页 > 其他分享 >P9901 『PG2』弯曲半平面直线同向图最大流 题解

P9901 『PG2』弯曲半平面直线同向图最大流 题解

时间:2024-02-23 16:47:33浏览次数:26  
标签:nxt cnt val int 题解 head PG2 P9901 Dinic

思路

正解想不出,只好用网络流了

网络流简介请戳这儿。这道题数据有点大用 EK 求最大流似乎过不了,所以本蒟蒻采用 Dinic 算法。

Dinic 算法

Dinic 算法相当于 EK 的优化。在原基础找增广路的基础上添加了一个分层操作,再通过深搜找阻塞流。

分层

从原点开始我们把可以通过一步到达的点记作第一层,两步到达的点记作第二层,依次类推,(注:在分层途中我们不考虑每条边的长度,即将边权看作为零)。

优化

在 Dinic 中有一个经典优化叫弧优化,意思是如果我们知道一条边已经增广到极限了,即已经发挥出最大价值,我们就不再用他了。

code

#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;
}

恭喜你获得 \(80\) 分代码,因为这道题数据过大所以需要加快读。

inline void read(register int &a)//快读模板
{
	a=0;char c;
	while((c=getchar())<48);
	do a=(a<<3)+(a<<1)+(c^48);
	while((c=getchar())>47);
} 

标签:nxt,cnt,val,int,题解,head,PG2,P9901,Dinic
From: https://www.cnblogs.com/wenzhihao2023/p/18029873

相关文章

  • 记录pyinstaller 打包 pdfplumber 问题解决过程
    今天有一个pdf文件处理需求,使用pdfplumber库完成,python环境是3.11+win10pyinstaller5.10.1打包完成后,工具可以顺利打开,但是执行处理的时候报错File"pypdfium2_raw\bindings.py",line93,in<module>File"pypdfium2_raw\bindings.py",line83,in_register_library......
  • blazor 问题解决
    Cannotprovideavalueforproperty'ScrollToLocationHash'ontype'Microsoft.AspNetCore.Components.Routing.Router'.Thereisnoregisteredserviceoftype'Microsoft.AspNetCore.Components.Routing.IScrollToLocationHash'.异常信息......
  • Jenkins构建提示docker命令权限问题解决方法
    参考:https://zhuanlan.zhihu.com/p/568513293使用Jenkins构建时使用的用户为jenkins在使用docker命令时会报以下错误ERROR:permissiondeniedwhiletryingtoconnecttotheDockerdaemonsocketatunix:///var/run/docker.sock:Get"http://%2Fvar%2Frun%2Fdocker.soc......
  • P6646 [CCO2020] Shopping Plans 题解
    好好玩的题。思路对于前\(K\)小方案问题。我们可以考虑当前方案对下一个方案的转移。重点在于转移的最优化与不重不漏。只有一种种类假设没有\(l,r\)的限制怎么做。我们不妨把所有价格排序。发现一种状态转移到另一种状态,无异与将其中已选择的一个物品不选,选择他后面......
  • process.env.API_KEY undefined问题解决
    问题现象已经在root路径下面创建.env文件,但是使用process.env.API_KEY获取不到值。分析获取不到env文件中的值,检查env文件已配置API_KEY,检查是否安装了dotenv,检查是否导入配置了dotenv解决方法在index.ts中导入import'dotenv/config';应该在使用env的模块前面就导入dote......
  • 2024.2.22模拟赛T3 题解
    对于区间连边,可以线段树优化建图对于单点连边,可以使用李超线段树维护迪杰斯特拉code#include<bits/stdc++.h>usingnamespacestd;#defineN400005#defineintlonglong#definepiipair<int,int>#definefirfirst#definesecsecondintn,m,tot;intval[N];const......
  • 数星星题解补充
    题解中那个看似暴力的染色,实际上正确性显然,直接看75%的时间复杂度证明然后还是直接看75分的部分它的里面说是用set维护块的前驱后继,然后全网没有一篇这样的题解,似乎全世界就我一个用这个方法于是想了一中午终于想到如何维护:就是用set记录每一个块的最后一个的位置,由于是区间覆......
  • P3870 分块题解
    这篇题解有点问题(分块标记处),但现在不想修,等有空修吧link分块是一种很神奇的暴力,学了它就会觉得什么都可以用分块做。分块的主要思想就是整块快速查询,散块暴力查询。比如说,分块可以在\(O(q\sqrt{n}+n)\)的时间复杂度内解决线段树模板题。回到本题,显然我们可以用每个块维护......
  • CF1372F Omkar and Modes 题解
    来个乱搞。思路考虑分治。对于最裸的暴力。我们可以调用solve(l,r)进行查询。假如这个区间的众数的出现次数是区间长度,那么可以直接退出,否则我们可以继续分治。我们把这个暴力进行加工一下。我们知道\(l\simr\)的区间众数后。查询\(l\simmid\)的区间众数,若完全......
  • CF1845F Swimmers in the Pool 题解
    思路考虑两个人什么时候会相遇。根据小学的相遇追及问题,两人会相遇的条件为:\[2\timesk\timesl=t\times(v1+v2)\]\[2\timesk\timesl=t\times(v1-v2)\]那么对于一个速度\(v\)。它可一相遇的次数即为:\[\frac{t\timesv}{2\timesl}\]当然,这样有可能会算重,也就是在相同......