POJ1273

POJ1273 Drainage Ditches

Description

一次下雨淹了Bessie的田,所以FJ建了个排水系统帮Bessie排水到。

整个排水系统由 N 个点,M条排水管道组成。

除起点和终点每个点每的排水量和入水量要一致,时刻每条管道有一个单位时间最大排水量 f

Bessie的田就是起点v1,终点是一条小溪点 vn

求单位时间整个排水系统单位时间最大排水量。

Input

第一行:两个整数, M N,意义如题。

接下来 M 行:

每行三个整数,S E C,表示点 S 和点E之间有条容量为 C <script type="math/tex" id="MathJax-Element-14">C</script>的排水管道。

Output

一行:一个整数,最大排水量。

solution

网络流裸题

code

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
#define oo 1000000000
//#include<
using namespace std;

int m,n,ans;
// in
struct Edge
{
    int ap,v;
    Edge *next,*fe;
}edge[510],*ind[210];
int l=0;

void input(int f,int t,int c)
{
    edge[++l].ap=t;
    edge[l].v=c;
    edge[l].next=ind[f];
    ind[f]=&edge[l];

    edge[++l].ap=f;
    edge[l].v=0;
    edge[l].next=ind[t];
    ind[t]=&edge[l];

    edge[l].fe=&edge[l-1];
    edge[l-1].fe=&edge[l];
}
//
int q[210],level[210];   //bfs构层次图
bool bfs()
{
    memset(q,0,sizeof(q));
    memset(level,0,sizeof(level));
    int h=1,t=2;
    q[h]=1;
    level[1]=1;
    while(h<t)
    {
        Edge *k=ind[q[h]];
        for(;k!=NULL;k=k->next)
        {
            if(k->v==0||level[k->ap]!=0) continue;

            q[t++]=k->ap;
            level[k->ap]=level[ q[h] ]+1;

        }
        h++;
    }

    return level[m]!=0 ? 1:0;
}

int dfs(int x,int maxin) //找增广路
{
    if(x==m) return maxin;
    int sum=0;

    Edge *i=ind[x];
    for(;i!=NULL;i=i->next)
    {
        if(maxin==sum) break;
        if(level[i->ap]<=level[x]||!i->v) continue;

        int k=dfs(i->ap,min(maxin-sum,i->v));
        i->v-=k;
        i->fe->v+=k;
        sum+=k;
    }
    if(sum!=maxin) level[u]=0; //当前弧优化
    return sum;
}
//
int main()
{
    scanf("%d%d",&n,&m);
    int l=1;
    for(int i=1;i<=n;i++)
    {
        int f,t,c;
        scanf("%d%d%d",&f,&t,&c);
        input(f,t,c);
    }
    while(bfs())
        ans+=dfs(1,oo);
    printf("%d",ans);
    return 0;
}
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值