求助有源汇有上下界最小流(LOJ117)
  • 板块学术版
  • 楼主zhjzhmh
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/5/25 20:32
  • 上次更新2023/10/28 00:38:06
查看原帖
求助有源汇有上下界最小流(LOJ117)
233815
zhjzhmh楼主2022/5/25 20:32
#include<bits/stdc++.h>
#define inf 1000000000
using namespace std;
int n,m,SS,TT,u,v,x,y,cnt=-1,q[50010],head[50010],dep[50010],cur[50100],ss,S,T,d[50010];
struct node{int to,next,w;}edge[1000010];
inline int read()
{
	int x=0,f=1;char ch=getchar();
	while(ch<'0'||ch>'9') {if(ch=='-') f=-1;ch=getchar();}
	while(ch>='0'&&ch<='9') x=x*10+ch-'0',ch=getchar();
	return x*f;
}
inline void Add(int x,int y,int z)
{ 
    edge[++cnt].to=y,edge[cnt].next=head[x],edge[cnt].w=z,head[x]=cnt;
    edge[++cnt].to=x,edge[cnt].next=head[y],edge[cnt].w=0,head[y]=cnt;
}
inline bool bfs(int s,int t)
{
	queue<int> q;memset(dep,0,sizeof(dep));dep[s]=1;q.push(s);
	while(!q.empty())
	{
		int x=q.front();q.pop();
		for(register int i=head[x];~i;i=edge[i].next)
		{
			if(dep[edge[i].to]==0&&edge[i].w>0) dep[edge[i].to]=dep[x]+1,q.push(edge[i].to);
			if(edge[i].to==t) return 1;
		}
	} 
	return 0;
}
inline int work(int k,int f,int t)
{
    if (k==t) return f;
    int used=0,fl=f;
    for (int i=cur[k];~i;i=edge[i].next)
    if (dep[k]+1==dep[edge[i].to]&&edge[i].w)
    {
        int w=work(edge[i].to,min(f,edge[i].w),t);
        if(!w) dep[w]=0;f-=w;edge[i].w-=w;edge[i^1].w+=w;
        used=i;if (!f) {cur[x]=i;return fl;}
    }
    cur[x]=used;return fl-f;
}
int main()
{
	n=read();m=read();SS=read();TT=read();S=0;T=n+1;memset(head,-1,sizeof(head));
	for(register int i=1;i<=m;i++)
	{
		u=read();v=read();x=read();y=read();
		Add(u,v,y-x);d[u]-=x;d[v]+=x;
	}
	for(register int i=1;i<=n;i++)
	  if(d[i]>0) Add(S,i,d[i]),ss+=d[i];
	    else if(d[i]<0) Add(i,T,-d[i]);
	int maxflow=0;
	while(bfs(0,T)) memcpy(cur,head,sizeof(head)),maxflow+=work(0,inf,T);Add(TT,SS,inf);
	while(bfs(0,T)) memcpy(cur,head,sizeof(head)),maxflow+=work(0,inf,T);
	if(maxflow!=ss) puts("please go home to sleep");
	else cout<<edge[cnt].w;
	return 0;
} 

RT,超时29分

2022/5/25 20:32
加载中...