社区讨论
subtask Re 求调
P4722【模板】最大流 加强版 / 预流推进参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m3eilwe3
- 此快照首次捕获于
- 2024/11/12 21:55 去年
- 此快照最后确认于
- 2025/11/04 14:50 4 个月前
CPP
#include<bits/stdc++.h>
#pragma GCC Optimize(3,"fast")
#define int long long
#define MAXN 121000
#define maxn 22001000
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int n,m,s,t,head[MAXN],h[MAXN],vis[MAXN],gap[MAXN],flow[MAXN],cnt=1;
struct cmp
{
inline bool operator ()(int x,int y)const
{
return h[x]<h[y];
}
};
priority_queue<int,vector<int>,cmp> pq;
queue<int> q;
struct edge
{
int to,nxt,val;
}e[maxn<<1];
inline void add(int x,int y,int z)
{
e[++cnt].to=y;
e[cnt].nxt=head[x];
head[x]=cnt;
e[cnt].val=z;
}
inline int read()
{
int x=0,f=1;
char ch=getchar();
while(!isdigit(ch))
{
if(ch=='-')
{
f=-1;
}
ch=getchar();
}
while(isdigit(ch))
{
x=(x<<3)+(x<<1)+(ch^'0');
ch=getchar();
}
return x*f;
}
inline bool bfs()
{
memset(h,INF,sizeof(h));
h[t]=0;
q.push(t);
while(q.size())
{
int x=q.front();
q.pop();
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(e[i^1].val&&h[y]>h[x]+1)
{
h[y]=h[x]+1;
q.push(y);
}
}
}
return h[s]!=INF;
}
inline void push(int x)
{
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(e[i].val&&h[y]+1==h[x])
{
int f=min(e[i].val,flow[x]);
e[i].val-=f;
e[i^1].val+=f;
flow[x]-=f;
flow[y]+=f;
if(y!=s&&y!=t&&!vis[y])
{
pq.push(y);
vis[y]=1;
}
if(!flow[x])
{
break;
}
}
}
}
inline void relabel(int x)
{
h[x]=INF;
for(int i=head[x];i;i=e[i].nxt)
{
int y=e[i].to;
if(e[i].val&&(h[y]+1<h[x]))
{
h[x]=h[y]+1;
}
}
}
inline int hlpp()
{
if(!bfs())
{
return 0;
}
h[s]=n;
for(int i=1;i<=n;i++)
{
if(h[i]!=INF)
{
gap[h[i]]++;
}
}
for(int i=head[s];i;i=e[i].nxt)
{
int y=e[i].to;
if(int f=e[i].val)
{
e[i].val-=f;
e[i^1].val+=f;
flow[y]+=f;
if(y!=s&&y!=t&&!vis[y])
{
pq.push(y);
vis[y]=1;
}
}
}
while(pq.size())
{
int x=pq.top();
pq.pop();
vis[x]=0;
push(x);
if(flow[x])
{
gap[h[x]]--;
if(!gap[h[x]])
{
for(int i=1;i<=n;i++)
{
if(i!=s&&i!=t&&h[i]>h[x]&&h[i]<n+1)
{
h[i]=n+1;
}
}
}
relabel(x);
gap[h[x]]++;
pq.push(x);
vis[x]=1;
}
}
return flow[t];
}
signed main()
{
n=read(),m=read(),s=read(),t=read();
for(int i=1;i<=m;i++)
{
int x=read(),y=read(),z=read();
add(x,y,z);
add(y,x,0);
}
printf("%lld",hlpp());
return 0;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...