1. 程式人生 > >最大流模板

最大流模板

open nbsp spa += evel scanf stdio.h 分享 hide

dinic

碼著

技術分享
#include<stdio.h>
#include<string.h>
#include<iostream>
using namespace std;
const int inf=0x7fffffff;
const int N=100000;
int head[N];
int level[N];
struct node
{
    int v,w,next;
}e[N*2];
int cnt;
int q[N];
void add(int u,int v,int w)
{
    e[cnt].v=v;
    e[cnt].w=w;
    e[cnt].next
=head[u]; head[u]=cnt++; } int bfs(int s,int t) { int l,r,u,v; l=r=0; memset(level,0,sizeof(level)); q[r++]=s; level[s]=0; while(l<r) { u=q[l++]; if(u==t)return 1; for(int i=head[u];i!=-1;i=e[i].next) { v=e[i].v;
if(!level[v]&&e[i].w) { level[v]=level[u]+1; q[r++]=v; } } } return 0; } int dfs(int u,int t,int maxf) { if(u==t)return maxf; int ret=0,tmp,v; for(int i=head[u];i!=-1;i=e[i].next) { v=e[i].v;
if(level[v]==level[u]+1 && e[i].w) { tmp=dfs(v,t,min(e[i].w,maxf-ret)); ret+=tmp; e[i].w-=tmp; e[i^1].w+=tmp; if(ret==maxf)return ret; } } return ret; } int dinic(int s,int t) { int ans=0; while(bfs(s,t))ans+=dfs(s,t,inf); return ans; } int main() { int n,m,u,v,w; while(~scanf("%d%d",&m,&n)) { memset(head,-1,sizeof(head)); cnt=0; for(int i=0;i<n;i++) { scanf("%d%d%d",&u,&v,&w); add(u,v,w); add(v,u,0); } int ans=dinic(1,n); cout<<ans<<endl; } return 0; }
View Code

最大流模板