冰糖鸽子 @ 2021-01-07 17:52:42
RT,WA 4,7,8,9,10
// Problem: P3376 【模板】网络最大流
// Contest: Luogu
// URL: https://www.luogu.com.cn/problem/P3376
// Memory Limit: 128 MB
// Time Limit: 2000 ms
// Powered by CP Editor (https://github.com/cpeditor/cpeditor)
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define M 205
bool vis[M];
int ans,h[M],hav[M],u,v,W,n,m,s,t,w[M][M];
vector<int>road[M];//first为v,second为w
queue<int>q;
bool R()//Bfs求联通否/每点深度
{
int up,vp;
q=queue<int>();
memset(h,0,sizeof(h));
q.push(s);h[s]=1;
while(!q.empty())
{
up=q.front();q.pop();
vis[up]=1;
for(int i=0;i<road[up].size();i++)
{
vp=road[up][i];
if(h[vp]||!w[up][vp]){continue;}
h[vp]=h[up]+1;
q.push(vp);
}
}
return h[t]!=0;
}
int done(int now,int u)
{
int res,sum=0;
if(u==t){return now;}
for(int i=0,v=road[u][0];i<road[u].size();i++,v=road[u][i])
{
if(h[v]-1!=h[u]||!w[u][v])
{
continue;
}
res=done(min(now,w[u][v]),v);
w[u][v]-=res;
w[v][u]+=res;
sum+=res;
if(sum==now){break;}
}
return sum;
}
void Ef()
{
while(R()){memset(vis,0,sizeof(vis));vis[s]=1;ans+=done(2009062700,s);}
cout<<ans;
}
signed main()
{
cin>>n>>m>>s>>t;
for(int i=1;i<=m;i++)
{
cin>>u>>v>>W;
road[u].push_back(v);w[u][v]=W;
road[v].push_back(u);w[v][u]=0;
}
Ef();
return 0;
}
/*
1 3 40
2 1 30
2 3 20
4 3 20
4 2 30
(图请看题面)
咱们走g
*/
/*
2+2+3
*/
by 幻影星坚强 @ 2021-01-07 17:59:00
他可没说不包括重边自环
by 幻影星坚强 @ 2021-01-07 17:59:09
@冰糖鸽子
by 冰糖鸽子 @ 2021-01-07 18:00:46
谢谢!
by 冰糖鸽子 @ 2021-01-07 18:14:34
加当前弧还是TLE 9/yiw
by zimujun @ 2021-01-07 18:34:06
@冰糖鸽子 如果某个点返回的流量为 0 就把那个点封锁掉,请
by zimujun @ 2021-01-07 18:35:02
@zimujunqwq
即在 dfs 里加上:
if(!res) h[v] = -1;
by zimujun @ 2021-01-07 19:00:41
@冰糖鸽子 这里应该这么写
res=done(min(now - sum,w[u][v]),v);
原因:每枚举完一条出边之后,这个点的剩余流量都会减少
by 血色黄昏 @ 2021-01-07 19:03:29
@冰糖鸽子 dinic貌似不需要加当前弧就能轻松过此题,反正我的跑的很轻松(
by zimujun @ 2021-01-07 19:05:09
@冰糖鸽子
模板题就不要下载数据点输出了吧(((
by SIXIANG32 @ 2021-01-08 20:41:06
Orz dmr 会网络流 stO