#include <iostream>
#include<stdio.h>
#include<string.h>
#include<string>
#include<queue>
using namespace std;
const int maxn=99999;
const int inf=999999999;
int to[maxn];
int head[maxn];
int next[maxn];
int value[maxn];
int tot;
int src,sink;
void init()
{
tot=0;
memset(head,-1,sizeof(head));
}
void addedge(int u,int v,int w)
{
to[tot]=v;
next[tot]=head[u];
value[tot]=w;
head[u]=tot++;
}
int dis[maxn];
int vis[maxn];
queue<int>que;
void bfs()
{
memset(dis,0,sizeof(dis));
while(!que.empty())
que.pop();
vis[src]=true;
que.push(src);
while(!que.empty())
{
int u=que.front();
que.pop();
for(int i=head[u];i!=-1;i=next[i])
{
if(value[i]>0&&vis[to[i]]==0)
{
que.push(to[i]);
dis[to[i]]=dis[u]+1;
vis[to[i]]=true;
}
}
}
}
int dfs(int u,int delta)//rc 源点 sink 汇点
{
if(u==sink)
{
return delta;
}
int ret=0;
for(int i=head[u];i!=-1&δi=next[i])
{
if(value[i]>0&&dis[to[i]]==dis[u]+1)
{
int dd=dfs(to[i],min(value[i],delta));
value[i]-=dd;
value[i^1]+=dd;
delta-=dd;
ret+=dd;
}
}
return ret;
}
int maxflow()
{
int ret=0;
while(true)
{
memset(vis,0,sizeof(vis));
bfs();
if(!vis[sink])
return ret;
ret+=dfs(src,inf);
}
return 0;
}
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
init();
for(int i=1;i<=n;i++)
{
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
addedge(a,b,c);
addedge(b,a,0);
}
src=1;
sink=m;
printf("%d\n",maxflow());
}
return 0;
}
dinic 板子
最新推荐文章于 2021-07-27 19:20:39 发布