首页 > 其他分享 >有源汇有上下界最大流 【loj】

有源汇有上下界最大流 【loj】

时间:2024-02-20 17:23:59浏览次数:19  
标签:sx return loj 有源 源点 汇点 st int 汇有

Describe:

\(n\) 个点,\(m\) 条边,每条边 \(e\) 有一个流量下界 \(\text{lower}(e)\) 和流量上界 \(\text{upper}(e)\),给定源点 \(s\) 与汇点 \(t\),求源点到汇点的最小流。

Solution:

首先因为仍然有流量的限制,第一步就是要找可行流。想到上题无源汇做法,尝试转换。

上题中可行流实际是个环,但这题因为有了源点和汇点,网络中并没有环。所以需要把源点和汇点连起来。因为源点可以无限流出流量,汇点可以无限汇进流量,所以可以连一条从汇点到源点的虚边,容量为 \(inf\)。再按照上题做法,找出可行流。

第二步就要考虑如何从可行流转换到最大流。显然应在可行流的基础上再汇入流量,看剩余的边可以继续流入多少。而可行流流入汇点的流量,已经被记录在虚边的反向边的容量了,加上新跑的最大流即可。

Code:

bool _Start;
#include<deque>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
namespace IO
{
	#define TP template<typename T>
	#define TP_ template<typename T,typename ... T_>
	#ifdef DEBUG
	#define gc() (getchar())
	#else
	char buf[1<<20],*p1,*p2;
	#define gc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<20,stdin),p1==p2)?EOF:*p1++)
	#endif
	#ifdef DEBUG
	void pc(const char &c)
	{
		putchar(c);
	}
	#else
	char pbuf[1<<20],*pp=pbuf;
	void pc(const char &c)
	{
		if(pp-pbuf==1<<20)
			fwrite(pbuf,1,1<<20,stdout),pp=pbuf;
		*pp++=c;
	}
	struct IO{~IO(){fwrite(pbuf,1,pp-pbuf,stdout);}}_;
	#endif
	TP void read(T &x)
	{
		x=0;static int f;f=0;static char ch;ch=gc();
		for(;ch<'0'||ch>'9';ch=gc())ch=='-'&&(f=1);
		for(;ch>='0'&&ch<='9';ch=gc())x=(x<<1)+(x<<3)+(ch^48);
		f&&(x=-x);
	}
	TP void write(T x)
	{
		if(x<0)
			pc('-'),x=-x;
		static T sta[35],top;top=0;
		do
			sta[++top]=x%10,x/=10;
		while(x);
		while(top)
			pc(sta[top--]^48);
	}
	TP_ void read(T &x,T_&...y){read(x);read(y...);}
	TP void writeln(const T x){write(x);pc('\n');}
	TP void writesp(const T x){write(x);pc(' ');}
	TP_ void writeln(const T x,const T_ ...y){writesp(x);writeln(y...);}
	TP void debugsp(const T x){fprintf(stderr,"%d ",x);}
	TP void debug(const T x){fprintf(stderr,"%d\n",x);}
	TP_ void debug(const T x,const T_...y){debugsp(x);debug(y...);}
	TP inline T max(const T &a,const T &b){return a>b?a:b;}
	TP_ inline T max(const T &a,const T_&...b){return max(a,max(b...));} 
	TP inline T min(const T &a,const T &b){return a<b?a:b;}
	TP_ inline T min(const T &a,const T_&...b){return min(a,min(b...));}
	TP inline void swap(T &a,T &b){static T t;t=a;a=b;b=t;}
	TP inline T abs(const T &a){return a>0?a:-a;}
	#undef TP
	#undef TP_
}
using namespace IO;
using std::cerr;
using LL=long long;
constexpr int N=2e2+5,M=1e4+5,inf=1e9;
struct edge
{
	int y,f,pre;
}a[M<<1];int alen=1,last[N];
void ins(int x,int y,int f)
{
	a[++alen]=edge{y,f,last[x]};
	last[x]=alen;
	a[++alen]=edge{x,0,last[y]};
	last[y]=alen;
}
int n,m,st,ed,S,T;
int h[N],cur[N];
bool pd()
{
	static std::deque<int>q;q.clear();
	memset(h,0,sizeof(h));h[st]=1;
	q.push_back(st);
	while(q.size())
	{
		int x=q.front();q.pop_front();
		for(int k=last[x];k;k=a[k].pre)
		{
			int y=a[k].y;
			if(a[k].f&&!h[y])
			{
				h[y]=h[x]+1;
				q.push_back(y);
			}
		}
	}
	return h[ed];
}
int findflow(int x,int f)
{
	if(x==ed)
		return f;
	int sx=0,sy;
	for(int &k=cur[x];k;k=a[k].pre)
	{
		int y=a[k].y;
		if(a[k].f&&h[y]==h[x]+1)
		{
			sy=findflow(y,min(a[k].f,f-sx));
			a[k].f-=sy;sx+=sy;
			a[k^1].f+=sy;
			if(sx==f)
				return sx;
		}
	}
	if(!sx)
		h[x]=-1;
	return sx;
}
int dinic()
{
	int s=0;
	while(pd())
	{
		memcpy(cur,last,sizeof(cur));
		s+=findflow(st,inf);
	}
	return s;
}
int in[N];
bool _End;
int main()
{
	// fprintf(stderr,"%.2 MBlf\n",(&_End-&_Start)/1048576.0);
	read(n,m,S,T);
	st=n+1;ed=st+1;
	for(int i=1;i<=m;i++)
	{
		int x,y,dn,up;
		read(x,y,dn,up);
		ins(x,y,up-dn);
		in[x]-=dn,in[y]+=dn;
	}
	int sum=0;
	for(int i=1;i<=n;i++)
		if(in[i]<0)
			ins(i,ed,-in[i]);
		else if(in[i]>0)
			ins(st,i,in[i]),sum+=in[i];
	ins(T,S,inf);
	if(dinic()!=sum)
		puts("please go home to sleep");
	else
	{
		st=S,ed=T;
		writeln(dinic());//在这次跑最大流的过程中,也会把虚边的反向边计入
	}
	return 0;
}

标签:sx,return,loj,有源,源点,汇点,st,int,汇有
From: https://www.cnblogs.com/lofty2007/p/18023598

相关文章

  • 无源汇有上下界可行流
    Describe:\(n\)个点,\(m\)条边,每条边\(e\)有一个流量下界\(\text{lower}(e)\)和流量上界\(\text{upper}(e)\),求一种可行方案满足流量守恒的同时满足每条边的限制条件。Solution:可以先考虑满足所有边的最低条件,获得一个初始的流量网络。这时各个点是不一定满足流量守恒......
  • 【loj】维护全序集
    平衡树的题能不打平衡树尽量别打,除非你闭着眼都能打对。Describe:维护一个多重集S,初始为空,有以下几种操作:把\(x\)加入\(S\)删除\(S\)中的一个\(x\),保证删除的\(x\)一定存在求\(S\)中第\(k\)小求\(S\)中有多少个元素小于\(x\)求\(S\)中小于\(x\)的最......
  • LOJ #2876. 「JOISC 2014 Day2」水壶 题解
    DescriptionJOI君所居住的IOI市以一年四季都十分炎热著称。IOI市被分成\(H\)行,每行包含\(W\)块区域。每个区域都是建筑物、原野、墙壁之一。IOI市有\(P\)个区域是建筑物,坐标分别为\((A_1,B_1),\)\((A_2,B_2),\)\(\ldots,\)\((A_P,B_P)\)。JOI君只能进入建......
  • loj 6095 花神的嘲讽计划 题解
    题目哈希记录每个\(k\)长度的串,询问的时候可以拿主席树或二分,这里说下二分。将\(n-k+1\)个串从小到大排序,以哈希值为第一关键字,序号为第二关键字。每次询问直接查找大于等于当前哈希值的位置即可,找到之后判断一下合不合法即可。具体看代码:#include<bits/stdc++.h>typede......
  • LOJ3990/LG9602 IOI2023 足球场 题解 (区间DP+精简无用状态)
    首先考虑一个足球场长啥样才是合法的。发现一个点能只拐弯一次到达另一个点,可以分为两种情况:先左右走,再上下走或先上下走,后左右走。无论哪种情况,都要求我们走一步使得和目标点一个轴相同,再走一步使得另一个轴也相同,所以加入把每一行选择的格子看成一个区间(因为如果不连续显然是......
  • CEOI2023D1T3(LOJ4019) Brought Down the Grading Server? (分治+欧拉回路)
    因为我们有\(S=2^k\),所以我们先考虑\(k=1\)即\(S=2\)的时候应该怎么做。发现如果我们对于每一个核心从\(t_1\)向\(t_2\)连一条无向边,如果我们把「不交换\(t_1,t_2\)」看成将这条边定向为\(t_1\tot_2\),否则如果「交换\(t_1,t_2\)」看成将这条边定向为\(t_2\tot_1......
  • 有源滤波在某棉纺企业低压配电室节能实践与选型
    安科瑞陈沁雨:187+0211=2873;0引言在电力系统中,谐波产生的根本原因是由于非线性负载所致。由于棉纺企业的绝大部分设备大量使用电子设备、变频器、整流器等,因此会产生大量谐波电流。我公司环锭纺细纱、络筒车间配电设备受谐波影响。造成低压总进线断路器烧损、电气设备运行温度超标使......
  • 安科瑞APF有源滤波装置在生物制药行业中的应用
    摘要:随着电子设备大量的使用,非线性负荷越来越多,企业电力网的谐波污染问题也越来越严重,由于谐波的不良作用恶化电能质量,增加附加损耗,降低电网可靠性,影响企业供用电设备的正常工作,甚至损害设备造成电气故障。结合用电安全要求及现状,浅谈有源滤波装置在生物制药安全供电系统中的作用及......
  • 有源滤波装置在水处理行业配电系统中的应用
    摘要:在水处理行业供配电系统中,涉及曝气风机、提升泵、污泥脱水设备等负荷设备,导致异步电动机产生较多无功功率和大量的谐波,使系统功率因数下降,以及谐波对配电系统、负载产生较大的危害。就此,水处理行业需提高对电能质量的重视,通过有源滤波装置治理,滤除谐波,从而节能降耗。关键词:水处......
  • 浅谈有源滤波装置在轨道交通行业的应用与选型
    摘要:轨道交通运行中需要大量的变频设备,导致其电网中含有大量的谐波,这些谐波影响到电网供电稳定性,从而威胁到城市轨道交通运输的安全性和稳定性。有源滤波装置在城市轨道交通中的应用,可以消除电网中的谐波,确保电网运行安全性。关键词:有源滤波;城市轨道交通;谐波治理0引言本文主要介绍......