编辑
2025-08-30
XCPC
00
请注意,本文编写于 141 天前,最后修改于 141 天前,其中某些信息可能已经过时。
#include <bits/stdc++.h> using namespace std; #define int long long const long long inf=1e18; const int M=1e6+5; int n,m,s,t; int dis[M],now[M],head[M]; int cnt=1; struct node { int to,net,w; } e[M]; inline void add(int u,int v,int w) { e[++cnt].to=v; e[cnt].w=w; e[cnt].net=head[u]; head[u]=cnt; e[++cnt].to=u; e[cnt].w=0; e[cnt].net=head[v]; head[v]=cnt; } inline int bfs() { //在惨量网络中构造分层图 for(int i=1;i<=n;i++) dis[i]=inf; queue<int> q; q.push(s); dis[s]=0; now[s]=head[s]; while(!q.empty()) { int x=q.front(); q.pop(); for(int i=head[x];i;i=e[i].net) { int v=e[i].to; if(e[i].w>0&&dis[v]==inf) { q.push(v); now[v]=head[v]; dis[v]=dis[x]+1; if(v==t) return 1; } } } return 0; } inline int dfs(int x,long long sum) { //sum是整条增广路对最大流的贡献 if(x==t) return sum; long long k,res=0; //k是当前最小的剩余容量 for(int i=now[x];i&&sum;i=e[i].net) { now[x]=i; //当前弧优化 int v=e[i].to; if(e[i].w>0&&(dis[v]==dis[x]+1)) { k=dfs(v,min(sum,e[i].w)); if(k==0) dis[v]=inf; //剪枝,去掉增广完毕的点 e[i].w-=k; e[i^1].w+=k; res+=k; //res表示经过该点的所有流量和(相当于流出的总量) sum-=k; //sum表示经过该点的剩余流量 } } return res; } void solve() { cin>>n>>m>>s>>t; cnt=1; for(int i=1;i<=m;i++) { int u,v,w; cin>>u>>v>>w; add(u,v,w); } int ans=0; while(bfs()) { ans+=dfs(s,inf); //流量守恒(流入=流出) } cout<<ans; for (int i=0;i<=cnt+n;++i) { dis[i]=now[i]=head[i]=0; } cnt=1; } signed main() { ios::sync_with_stdio(false), cin.tie(NULL), cout.tie(NULL); int t=1; // cin>>t; while(t--) solve(); return 0; }
如果对你有用的话,可以打赏哦
打赏
ali pay
wechat pay