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

最大流模板(poj3469)

时间:2015-07-24 18:26:39      阅读:70      评论:0      收藏:0      [点我收藏+]

标签:最小割最大流

代码:

#include <algorithm>
#include <iostream>
#include <sstream>
#include <cstdlib>
#include <cstring>
#include <iomanip>
#include <cstdio>
#include <string>
#include <bitset>
#include <vector>
#include <queue>
#include <stack>
#include <cmath>
#include <list>
#include <map>
#include <set>
#define sss(a,b,c) scanf("%d%d%d",&a,&b,&c)
#define mem1(a) memset(a,-1,sizeof(a))
#define mem(a) memset(a,0,sizeof(a))
#define ss(a,b) scanf("%d%d",&a,&b)
#define s(a) scanf("%d",&a)
#define INF 0x3f3f3f3f
#define w(a) while(a)
#define PI acos(-1.0)
#define LL long long
#define eps 10E-9
//#define N 100010<<1
#define mod 1000000000+7
using namespace std;
void mys(int& res)
{
    int flag=0;
    char ch;
    while(!(((ch=getchar())>=‘0‘&&ch<=‘9‘)||ch==‘-‘))
        if(ch==EOF)  res=INF;
    if(ch==‘-‘)  flag=1;
    else if(ch>=‘0‘&&ch<=‘9‘)  res=ch-‘0‘;
    while((ch=getchar())>=‘0‘&&ch<=‘9‘)  res=res*10+ch-‘0‘;
    res=flag?-res:res;
}
void myp(int a)
{
    if(a>9)
        myp(a/10);
    putchar(a%10+‘0‘);
}
/********************the end of template********************/
#define maxn 20010
#define maxm 1000000
struct Eg{
   int to;
   int next;
   int f;
}E[maxm];
int V[maxn],num;
int N,M;
void add(int u,int v,int c){
    E[num].to=v;
    E[num].f=c;
    E[num].next=V[u];
    V[u]=num++;
    E[num].to=u;
    E[num].f=0;
    E[num].next=V[v];
    V[v]=num++;
}
int level[maxn];
int qu[maxn];
bool BFS(int s,int t){
    int i,iq=0;
    for(i=0;i<=t;i++) level[i]=0;
    int u,v,e;
    qu[iq++]=s;
    level[s]=1;
    for(i=0;i<iq;i++){
      u=qu[i];
      if(u==t) return true;
      for(e=V[u];e!=-1;e=E[e].next){
        v=E[e].to;
        if(!level[v]&&E[e].f>0)
        {
            level[v]=level[u]+1;
            qu[iq++]=v;
        }
      }
   }
   return false;
}
int cur[maxn];
int dfs(int u,int maxf,int t){
    if(u==t||maxf==0) return maxf;
    int ret=0,f,e,v;
    for(e=cur[u];e!=-1;e=E[e].next){// 当前弧优化
         v=E[e].to;
         if(E[e].f>0&&level[u]+1==level[v]){
           f= dfs(v,min(maxf,E[e].f),t);
           E[e].f-=f;
           E[e^1].f+=f;
           maxf-=f;
           ret+=f;
           cur[u]=e;
           if(maxf==0) break;
        }
    }
    return ret;
}
int Dinic(int s,int t){
   int flow=0;
   while(BFS(s,t)){
     for(int i=0;i<=t;i++)
      cur[i]=V[i];
     flow+=dfs(s,mod,t);
   }
   return flow;
}
int main(){
    int a,b,w;
    w(ss(N,M)!=EOF){
    for(int i=0;i<=N+1;i++) V[i]=-1;
    num=0;
    for(int i=1;i<=N;i++){
        ss(a,b);
        add(0,i,a);
        add(i,N+1,b);
    }
    w(M--){
        sss(a,b,w);
        add(a,b,w);
        add(b,a,w);
    }
    printf("%d\n",Dinic(0,N+1));
   }
   return 0;
}




版权声明:本文为博主原创文章,未经博主允许不得转载。

最大流模板(poj3469)

标签:最小割最大流

原文地址:http://blog.csdn.net/bigsungod/article/details/47043615

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