Dinic 模板

时间:2023-12-03 11:11:02
 #include <iostream>
#include <cstring>
#include <cstdio>
#include <queue> using namespace std;
const int INF=;
const int maxn=,maxm=;
int cnt,fir[maxn],nxt[maxm],cap[maxm],to[maxm],dis[maxn]; void addedge(int a,int b,int c)
{
nxt[++cnt]=fir[a];
to[cnt]=b;
cap[cnt]=c;
fir[a]=cnt;
} bool BFS(int S,int T)
{
memset(dis,,sizeof(dis));
dis[S]=;
queue<int>q;q.push(S);
while(!q.empty())
{
int node=q.front();q.pop();
for(int i=fir[node];i;i=nxt[i])
{
if(!cap[i]||dis[to[i]])continue;
dis[to[i]]=dis[node]+;
q.push(to[i]);
}
}
return dis[T];
} int DFS(int node,int T,int f)
{
if(node==T)return f;
int d,ret=;
for(int i=fir[node];i;i=nxt[i])
{
if(!cap[i]||dis[to[i]]!=dis[node]+)continue;
if(!f)break;
d=DFS(to[i],T,min(cap[i],f));
if(d){
ret+=d;
cap[i]-=d;
cap[i^]+=d;
f-=d;
}
}
return ret;
} int Dinic(int S,int T)
{
int ret=,d;
while(BFS(S,T)&&(d=DFS(S,T,INF)))
ret+=d;
return ret;
} void Init()
{
memset(fir,,sizeof(fir));
cnt=;
}
int main()
{
int n,m;
while(~scanf("%d%d",&m,&n))
{
Init();
for(int i=;i<=m;i++){
int x,y,c;
scanf("%d%d%d",&x,&y,&c);
addedge(x,y,c);
addedge(y,x,);
}
printf("%d\n",Dinic(,n));
} return ;
}