POJ 1273 Drainage Ditches 【网络流】

89 篇文章 0 订阅
16 篇文章 0 订阅

裸网络流,注意一下可能又重边就可。

献上一个Dinic模板

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
using namespace std;
#define N 210
int g[N][N];
class Dinic {
public:
    static const int INF = 1000000007, SIZE = 205;
    int c[SIZE][SIZE];
    int n,s,t,l[SIZE],e[SIZE];
    int flow(int maxf = INF) {
        int left=maxf;
        while(build()) left-=push(s,left);
        return maxf-left;
    }
    int push(int x, int f) {
        if(x==t) return f;
        int& y=e[x],sum=f;
        for(; y<n; y++)
            if(c[x][y]>0 && l[x]+1==l[y]) {
                int cnt=push(y,min(sum,c[x][y]));
                c[x][y]-=cnt;
                c[y][x]+=cnt;
                sum-=cnt;
                if(!sum) return f;
            }
        return f-sum;
    }
    bool build() {
        int m=0;
        memset(l,-1,sizeof(l));
        l[e[m++]=s]=0;
        for(int i=0; i<m; i++) for(int y=0; y<n; y++)
                if(c[e[i]][y]>0 && l[y]<0) l[e[m++]=y]=l[e[i]]+1;
        memset(e,0,sizeof(e));
        return l[t]>=0;
    }
} net;
void Init(int n) {
    memset(net.c, 0, sizeof(net.c));
    for (int i=0; i<n; i++) for (int j=0; j<n; j++)
            net.c[i][j] = g[i][j];
    net.s = 0;
    net.t = n-1;
    net.n = n;
}
int main() {

    int n, m, a, b, c;
    while (scanf("%d%d", &m, &n) == 2) {
        memset(g, 0, sizeof(g));
        while (m--) {
            scanf("%d%d%d", &a, &b, &c);
            a--, b--;
            g[a][b] += c; //有向图,重边
        }
        Init(n);
        int ans = net.flow();
        cout << ans << endl;

    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值