#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2e5;
int n,m,s,t;
int vis[maxn];
struct node
{
int to,w,nxt;
}e[maxn];
int head[maxn],cnt;
void addedge(int u,int v,int w)
{
// e[cnt]=(node){v,w,head[u]};
e[cnt].w=w;
e[cnt].to=v;
e[cnt].nxt=head[u];
head[u]=cnt++;
}
int dfs(int x,int flow)
{
vis[x]=1;
if(x==t)
{
return flow;
}
for(int i=head[x];i!=-1;i=e[i].nxt)
{
int y=e[i].to;
int w=e[i].w;
if(!vis[y]&&w)
{
int k=dfs(y,min(flow,w));
if(k>0)
{
e[i].w-=k;
e[i^1].w+=k;
return k;
}
}
}
return 0;
}
int main()
{
int i,j;
memset(head,-1,sizeof(head));
scanf("%d %d %d %d",&n,&m,&s,&t);
for ( i=0; i<m; i++ ) {
int u,v,w;
scanf("%d %d %d",&u,&v,&w);
addedge(u,v,w);addedge(v,u,0); // 建一条正常边,再建一条权值为0的反向边
}
int ans = 0,k;
while ( memset(vis,0,sizeof(vis))&&(k=dfs(s,0x3f3f3f3f)) ) { // 找增广路,直到没有增广路结束
ans += k;
}
printf("%d\n",ans);
return 0;
}
网络流(FF算法)
猜你喜欢
转载自blog.csdn.net/Ramzes_666_fan/article/details/104193320
今日推荐
周排行