社区讨论

求助

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 条回复,欢迎继续交流。

正在加载回复...