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

网络流例题学习

时间:2016-03-26 14:09:02      阅读:201      评论:0      收藏:0      [点我收藏+]

标签:

之前似乎网络流的建图题做得比较少啊…现在来做一点。

首先是模板。

poj1273 草地排水

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 233333
int n,M=1;
typedef long long ll;
int fst[SZ],nxt[SZ],vb[SZ]; ll cap[SZ];
void ad_dl(int a,int b,ll c)
{
    ++M; nxt[M]=fst[a]; fst[a]=M; vb[M]=b; cap[M]=c;
}
void addl(int a,int b,ll c)
{
    ad_dl(a,b,c); ad_dl(b,a,0);
}
int S,T,q[SZ],d[SZ];
bool bfs()
{
    memset(d,-1,sizeof(d));
    d[S]=0; q[1]=S; int h=1,t=2;
    while(h!=t)
    {
        int cur=q[h++];
        for(int e=fst[cur];e;e=nxt[e])
        {
            int b=vb[e];
            if(d[b]==-1&&cap[e]);else continue;
            d[b]=d[cur]+1; q[t++]=b;
        }
    }
    return d[T]!=-1;
}
ll dfs(int x,ll f)
{
    if(f<=0) return 0;
    if(x==T) return f;
    ll ca=0;
    for(int e=fst[x];e;e=nxt[e])
    {
        int b=vb[e];
        if(d[b]!=d[x]+1) continue;
        ll w=dfs(b,min(cap[e],f-ca));
        cap[e]-=w; cap[e^1]+=w; ca+=w;
        if(ca==f) break;
    }
    if(!ca) d[x]=-1;
    return ca;
}
#define inf 100000000000000000LL
ll dinic()
{
    ll ans=0;
    while(bfs()) ans+=dfs(S,inf);
    return ans;
}
int main()
{
    int m;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        memset(fst,0,sizeof(fst)); M=1;
        for(int i=1;i<=m;i++)
        {
            int a,b,c;
            scanf("%d%d%d",&a,&b,&c);
            addl(a,b,c);
        }
        S=1; T=n;
        printf("%d\n",dinic());
    }
}

poj2135 农场之旅

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <algorithm>
#include <string.h>
#include <vector>
#include <limits>
#include <set>
#include <map>
using namespace std;
#define SZ 233333
typedef long long ll;
int M=1,S,T,fst[SZ],nxt[SZ],va[SZ],vb[SZ];
ll cap[SZ],cost[SZ];
void ad_dl(int a,int b,ll ca,ll co)
{
    ++M; nxt[M]=fst[a]; fst[a]=M; va[M]=a; vb[M]=b; cap[M]=ca; cost[M]=co;
}
void addl(int a,int b,ll ca,ll co) {ad_dl(a,b,ca,co); ad_dl(b,a,0,-co);}
ll dis[SZ]; int n,q[SZ],fe[SZ];
bool inq[SZ];
bool spfa()
{
    ll inf=2000000000000000LL;
    for(int i=1;i<=n;i++) dis[i]=inf;
    inq[S]=1; q[1]=S; dis[S]=0; int h=1,t=2;
    while(h!=t)
    {
        int cur=q[h++]; h&=131071;
        for(int e=fst[cur];e;e=nxt[e])
        {
            if(!cap[e]||dis[vb[e]]<=dis[cur]+cost[e]) continue;
            int b=vb[e],co=cost[e];
            dis[b]=dis[cur]+co; fe[b]=e;
            if(!inq[b]) {inq[b]=1; q[t++]=b; t&=131071;}
        }
        inq[cur]=0;
    }
    return dis[T]!=inf;
}
ll mcf()
{
    ll ans=0;
    while(spfa())
    {
        ll cur=2000000000000000LL;
        for(int i=fe[T];i;i=fe[va[i]]) cur=min(cur,cap[i]);
        for(int i=fe[T];i;i=fe[va[i]])
        {
            ans+=cur*cost[i];
            cap[i]-=cur; cap[i^1]+=cur;
        }
    }
    return ans;
}
int main()
{
    int m; scanf("%d%d",&n,&m); n+=2;
    S=1; T=n;
    addl(1,2,2,0); addl(T-1,T,2,0);
    while(m--)
    {
        int a,b,c;
        scanf("%d%d%d",&a,&b,&c);
        addl(a+1,b+1,1,c);
        addl(b+1,a+1,1,c);
    }
    printf("%d\n",(int)mcf());
}

网络流例题学习

标签:

原文地址:http://www.cnblogs.com/zzqsblog/p/5322713.html

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