社区讨论
求助
P4722【模板】最大流 加强版 / 预流推进参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @lo8r7fz2
- 此快照首次捕获于
- 2023/10/27 23:14 2 年前
- 此快照最后确认于
- 2023/10/27 23:14 2 年前
求助dalao,只对一个点
CPP#include<cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <queue>
#define int long long
using namespace std;
const int N=1e6+10,INF=7234017283807667300;
int n,m,s,t,h[N],bj[N],gap[N],e[N];
struct node{int num,val,next;};
vector<node> p[N];
priority_queue<pair<int,int> > que;
void add(int x,int y,int w){p[x].push_back({y,w,p[y].size()});p[y].push_back({x,0,p[x].size()-1});}
bool bfs(){
queue<int> que;
memset(h+1,100,sizeof(int)*n);
que.push(t);
h[t]=0;
while(!que.empty()){
int x=que.front();
que.pop();
for(int i=0;i<p[x].size();i++){
int v=p[x][i].num;
if(p[v][p[x][i].next].val&&h[v]>h[x]+1){
h[v]=h[x]+1;
que.push(v);
}
}
}
return h[s]!=INF;
}
void push(int x){
for(int i=0;i<p[x].size();i++){
int v=p[x][i].num;
if(p[x][i].val&&h[x]==h[v]+1){
int res=min(p[x][i].val,e[x]);
p[x][i].val-=res;
p[v][p[x][i].next].val+=res;
e[x]-=res;
e[v]+=res;
if(v!=s&&v!=t&&!bj[v]){bj[v]=1;que.push({h[v],v});};
if(!e[x])break;
}
}
}
void relable(int x){
h[x]=INF;
for(int i=0;i<p[x].size();i++){
int v=p[x][i].num;
if(p[x][i].val)h[x]=min(h[x],h[v]+1);
}
}
int HHLP(){
if(!bfs())return 0;
h[s]=n;
for(int i=1;i<=n;i++){
if(h[i]<INF)gap[h[i]]++;
}
for(int i=0;i<p[s].size();i++){
int v=p[s][i].num;
if(p[s][i].val){
int w=p[s][i].val;
p[s][i].val-=w;
p[v][p[s][i].next].val+=w;
e[s]-=w;
e[v]+=w;
if(v!=s&&v!=t&&!bj[v]&&h[v]<INF)
que.push({h[v],v}),bj[v]=1;
}
}
while(!que.empty()){
int x=que.top().second;
que.pop();
push(x);
bj[x]=0;
if(e[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]=max(h[i],n+1);};};
gap[h[x]]++;
bj[x]=1;
relable(x);
que.push({h[x],x});
}
}
return e[t];
}
signed main(){
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++){int x,y,z;scanf("%lld%lld%lld",&x,&y,&z);add(x,y,z);}
cout<<HHLP();
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...