加强数据!
查看原帖
加强数据!
816227
PLYnotAK楼主2024/4/12 17:00
#include<bits/stdc++.h>
#define FOR(i,a,b) for(register int i=a;i<=b;i++)
#define ROF(i,a,b) for(register int i=a;i>=b;i--)
#define P std::pair
#define Q std::queue
#define V std::vector
#define MP std::make_pair
#define fi first
#define se second
#define pb emplace_back
#define int long long
#define db long double
#define ls(x) (x<<1)
#define rs(x) (x<<1)|1
#define lowbit(x) (x&(-x))

const int N=1205,inf=0x3f3f3f3f3f3f3f3f;

struct Edge{
    int v,w,r;
};
V<Edge>a[N];
void add(int u,int v,int w){
    a[u].pb(Edge{v,w,(int)a[v].size()});
    a[v].pb(Edge{u,0,(int)a[u].size()-1});
}
int n,m,s,t;
int ht[N],ex[N],gap[N],lvl=0;
std::stack<int>B[N];
int push(int u){
    bool init=(u==s);
    for(auto&i:a[u]){
        if(!i.w||(!init&&ht[u]!=ht[i.v]+1)||ht[i.v]==inf)continue;
        int k=init?i.w:std::min(i.w,ex[u]);
        if(i.v!=s&&i.v!=t&&!ex[i.v])B[ht[i.v]].push(i.v),lvl=std::max(lvl,ht[i.v]);
        ex[u]-=k,ex[i.v]+=k,i.w-=k,a[i.v][i.r].w+=k;
        if(!ex[u])return 0;
    }
    return 1;
}
void relabal(int u){
    ht[u]=inf;
    for(auto i:a[u])if(i.w)ht[u]=std::min(ht[u],ht[i.v]);
    if(++ht[u]<n){
        B[ht[u]].push(u);
        lvl=std::max(lvl,ht[u]);
        ++gap[ht[u]];
    }
}
bool bfs(){
    memset(ht,0x3f,sizeof(ht));
    Q<int>q;q.push(t);ht[t]=0;
    while(!q.empty()){
        int u=q.front();q.pop();
        for(auto i:a[u])
            if(a[i.v][i.r].w&&ht[i.v]>ht[u]+1)
                ht[i.v]=ht[u]+1,q.push(i.v);
    }
    return ht[s]!=inf;
}
int select(){
    while(~lvl&&B[lvl].empty())lvl--;
    return lvl==-1?0:B[lvl].top();
}
int hlpp(){
    if(!bfs())return 0;
    FOR(i,1,n)if(ht[i]!=inf)gap[ht[i]]++;
    ht[s]=n;push(s);int u;
    while((u=select())){
        B[lvl].pop();
        if(push(u)){
            if(!--gap[ht[u]])FOR(i,1,n)
                if(i!=s&&ht[i]>ht[i]&&ht[i]<n+1)
                    ht[i]=n+1;
            relabal(u);
        }
    }
    return ex[t];
}
signed main(){
    std::cin.tie(0)->sync_with_stdio(0);
    std::cin>>n>>m>>s>>t;
    FOR(i,1,m){
        int u,v,w;
        std::cin>>u>>v>>w;
        add(u,v,w);
    }
    std::cout<<hlpp();
    return 0;
}

hlpp里面我写成了ht[i]>ht[i]但一样过了这题

2024/4/12 17:00
加载中...