码迷,mamicode.com
首页 > 其他好文 > 详细

最大流模板

时间:2017-10-23 21:45:10      阅读:136      评论:0      收藏:0      [点我收藏+]

标签:class   ini   div   end   oid   next   code   const   struct   

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

 

最大流模板

标签:class   ini   div   end   oid   next   code   const   struct   

原文地址:http://www.cnblogs.com/Kong-Ruo/p/7718888.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!