萌新刚学 Dinic 16pts 求助

P3376 【模板】网络最大流

Lovely_Cheese @ 2024-02-05 20:43:10

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,st,ed,ans=0;
struct node{
    int to,nxt,val;
}w[5141<<1];
int h[5141<<1],cnt=1;
void Link(int x,int y,int val){
    ++cnt;
    w[cnt].to=y;
    w[cnt].nxt=h[x];
    w[cnt].val=val;
    h[x]=cnt;
    return ;
}
queue<int> q;
int cur[5141<<1],dep[5141<<1];
bool bfs(){
    for(int i=1;i<=n;i++) dep[i]=0;
    dep[st]=1;
    q.push(st);
    while(!q.empty()){
        int x=q.front();
        q.pop();
        for(int i=h[x];i!=-1;i=w[i].nxt){
            int y=w[i].to;
            if(w[i].val){
                if(!dep[y]){
                    q.push(y);
                    dep[y]=dep[x]+1;
                    if(y==ed) return true;
                }
            }
        }
    }
    return false;
}
int dfs(int x,int flow){
    if(x==ed) return flow;
    int rest=flow,u;
    for(int i=cur[x];i!=-1&&rest;i=w[i].nxt){
        cur[x]=i;
        int y=w[i].to,val=w[i].val;
        if(val){
            if(dep[y]==dep[x]+1){
                u=dfs(y,min(rest,val));
                if(!u) dep[y]=0;
                w[i].val-=u;
                w[i^1].val+=u;
                rest-=u;
            }
        }
    }
    return flow-rest;
}
void Dinic(){
    int flow=0;
    while(bfs()){
        for(int i=1;i<=n;i++) cur[i]=h[i];
        while(flow=dfs(st,INT_MAX)) ans+=flow;
    }
    return ;
}
signed main(){
    memset(h,-1,sizeof(h));
    cin>>n>>m>>st>>ed;
    for(int i=1;i<=m;i++){
        int u,v,w;
        cin>>u>>v>>w;
        Link(u,v,w);
        Link(v,u,0);
    }
    Dinic();
    cout<<ans<<endl;
    return 0;
}

by Stevehim @ 2024-02-05 20:52:07

@Lovely_Cheese 把读入优化一下就可以了

推荐使用fread快读或直接加

ios::sync_with_stdio(false),cin.tie(0), cout.tie(0);

by Lovely_Cheese @ 2024-02-05 20:59:42

@Stevehim 加了没用


by Super_Cube @ 2024-02-05 21:02:42

@Lovely_Cheese 你把 bfs 里面的 if(y==ed) return true; 删掉,然后在最后的地方改为 return dep[ed];


by Super_Cube @ 2024-02-05 21:05:29

@Lovely_Cheese 亲测过了。


|