• HDU-4280 Island Transport


    题目链接:HDU-4280 Island Transport

    题意

    给出$n$个岛屿$m$条双向航道,岛屿以直角坐标系上的坐标形式给出,每条航道在单位时间有运输量上限,问单位时间内从$x$轴最左边的岛屿到最右边的岛屿最大的运输量。


    思路

    最大流问题,最左边的岛屿为源点,最右边的岛屿为汇点,按所给航道连边即可,由于是无向边,所以不需要再建容量为0的反向边。$n,m$很大,要用效率较高的Dinic算法求解最大流。


    代码实现

    #include <iostream>
    #include <cstdio>
    #include <cstring>
    #include <queue>
    #define RG register
    #define getc() (S == T && (T = (S = B) + fread(B, 1, 1 << 15, stdin), S == T) ? EOF : *S++)
    using std::queue;
    const int INF = 0x3f3f3f3f, N = 100010, M = 200020;
    int head[N], d[N];
    int s, t, tot, maxflow;
    struct Edge
    {
        int to, cap, nex;
    } edge[M];
    queue<int> q;
    char B[1 << 15], *S = B, *T = B;
    inline int read() {
        RG char ch; RG int x = 0; RG bool m = 0;
        while (ch = getc(), (ch < '0' || ch > '9') && ch != '-') ;
        ch == '-' ? m = 1 : x = ch - '0';
        while (ch = getc(), ch >= '0' && ch <= '9') x = x * 10 + ch - '0';
        return m ? -x : x;
    }
    void add(int x, int y, int z) {
        edge[++tot].to = y, edge[tot].cap = z, edge[tot].nex = head[x], head[x] = tot;
        //edge[++tot].to = x, edge[tot].cap = 0, edge[tot].nex = head[y], head[y] = tot;
    }
    bool bfs() {
        memset(d, 0, sizeof(d));
        while (q.size()) q.pop();
        q.push(s); d[s] = 1;
        while (q.size()) {
            int x = q.front(); q.pop();
            for (int i = head[x]; i; i = edge[i].nex) {
                int v = edge[i].to;
                if (edge[i].cap && !d[v]) {
                    q.push(v);
                    d[v] = d[x] + 1;
                    if (v == t) return true;
                }
            }
        }
        return false;
    }
    int dinic(int x, int flow) {
        if (x == t) return flow;
        int rest = flow, k;
        for (int i = head[x]; i && rest; i = edge[i].nex) {
            int v = edge[i].to;
            if (edge[i].cap && d[v] == d[x] + 1) {
                k = dinic(v, std::min(rest, edge[i].cap));
                if (!k) d[v] = 0;
                edge[i].cap -= k;
                edge[i^1].cap += k;
                rest -= k;
            }
        }
        return flow - rest;
    }
    void init() {
        tot = 1, maxflow = 0;
        memset(head, 0, sizeof(head));
    }
    
    int main() {
        int T = read();
        while (T--) {
            init();
            int n = read(), m = read();
            int xx, yy, lx = INF, rx = -INF;
            for (int i = 0; i < n; i++) {
                xx = read(), yy = read();
                if (xx < lx) lx = xx, s = i + 1;
                if (xx > rx) rx = xx, t = i + 1;
            }
            for (int i = 0, u, v, z; i < m; i++) {
                u = read(), v = read(), z = read();
                add(u, v, z);
                add(v, u, z);
            }
            while (bfs()) maxflow += dinic(s, INF);
            printf("%d
    ", maxflow);
        }
        return 0;
    }
    View Code
    作者:_kangkang
    本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。
  • 相关阅读:
    控件的用法ComboBox;RadionButton;Timer;DataGridView
    echo.js实现图片延迟加载,
    取消移动端a标签点击变色
    JS实现上传图片实时预览
    Myeclipse6.0安装svn插件
    警告: Parameters: Character decoding failed. Parameter skipped
    jsp到action 传递url时中文出现乱码
    java面试题
    myeclipse中hibernate出错
    java中abstract的用法
  • 原文地址:https://www.cnblogs.com/kangkang-/p/11331627.html
Copyright © 2020-2023  润新知