社区讨论
60pts RE&WA 求条(Dinic)
P3376【模板】网络最大流参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @mipuhjgm
- 此快照首次捕获于
- 2025/12/03 18:09 3 个月前
- 此快照最后确认于
- 2025/12/03 18:15 3 个月前
rt
CPP//Network Stream
//Code by LittleI
#include <bits/stdc++.h>
#define int long long
#define mp make_pair
#define ft first
#define sc second
using namespace std;
const int inf=1ll<<60;
int n,m,s,t;vector<pair<int,int> >g[20003];
int ans=0,dep[20003];
bool bfs()
{
memset(dep,-1,sizeof(dep));
queue<int>q;
q.push(s);dep[s]=0;
while(!q.empty())
{
int u=q.front();q.pop();
for(auto vv:g[u])
{
int v=vv.ft,w=vv.sc;
if(dep[v]==-1&&w>0)
dep[v]=dep[u]+1,
q.push(v);
// if(v==t) return 1;
}
}
return (dep[t]==-1);
}
int dfs(int u,int f)
{
if(u==t) return f;int used=0;
for(int i=0;i<(int)g[u].size();i++)
{
auto vv=g[u][i];
int v=vv.ft,w=vv.sc;
if(w&&dep[v]==dep[u]+1)
{
int ww=dfs(v,min(f-used,w));
if(ww>0) used+=ww,g[u][i].sc-=ww,g[v][i^1].sc+=ww;
if(used==f) return f;
}
}
if(!used) dep[u]=-1;
return used;
}
void dinic()
{while(!bfs()) ans+=dfs(s,inf);}
signed main()
{
cin >> n >> m >> s >> t;
for(int i=1;i<=m;i++)
{
int u,v,w;cin >> u >> v >> w;
g[u].emplace_back(mp(v,w));
g[v].emplace_back(mp(u,0));
}
dinic();
cout << ans;
return 0;
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...