• poj1459


    初涉网络流。改日再写一些概念性的介绍。

    ek算法可作为模板使用。

    #include <iostream>
    #include <queue>

    using namespace std;

    #define MAXN 105
    #define inf 1 << 20

    bool used[MAXN];
    int pre[MAXN];
    int map[MAXN][MAXN];
    int vertices, power_stations, consumers, edges;

    int EK()
    {
        int i, res = 0, now, min;
        queue<int>q;
        while (1)
        {
            memset(pre, -1, sizeof(pre));
            memset(used, 0, sizeof(used));
            while (!q.empty())
                q.pop();
            q.push(0);
            used[0] = true;
            while (!q.empty())
            {
                now = q.front();
                q.pop();
                if (now == vertices + 1)
                    break;
                for (i = 0; i <= vertices + 1; i++)
                {
                    if (!used[i] && map[now][i]>0)
                    {
                        pre[i] = now;
                        used[i] = true;
                        q.push(i);
                    }
                }
            }
            if (!used[vertices + 1])
                break;
            min = inf;
            for (i = vertices + 1; i != 0; i = pre[i])
            if (map[pre[i]][i]<min)
                min = map[pre[i]][i];
            res = res + min;
            for (i = vertices + 1; i != 0; i = pre[i])
            {
                map[pre[i]][i] = map[pre[i]][i] - min;
                map[i][pre[i]] = map[i][pre[i]] + min;
            }
        }
        return res;
    }

    int main()
    {

        while (cin >> vertices >> power_stations >> consumers >> edges)
        {
            memset(map, 0, sizeof(map));
            for (int i = 0; i < edges; i++)
            {
                char waste;
                int from, to, capacity;
                cin >> waste >> from >> waste >> to >> waste >> capacity;
                map[from+1][to+1] = capacity;
            }

            int super_s, super_t;
            super_s = 0, super_t = vertices + 1;
            //vertices += 2;

            for (int i = 0; i < power_stations; i++)
            {
                char waste;
                int to, capacity;
                cin >> waste >> to >> waste >> capacity;
                map[super_s][to+1] = capacity;
            }

            for (int i = 0; i < consumers; i++)
            {
                char waste;
                int from, capacity;
                cin >> waste >> from >> waste >> capacity;
                map[from+1][super_t] = capacity;
            }
            cout << EK() << endl;
        }
        return 0;
    }



  • 相关阅读:
    第一个独立开发的游戏 怪斯特:零 已经上线APP STORE!
    Cocos2d 利用继承Draw方法制作可显示三维数据(宠物三维等)的三角形显示面板
    java 实现 多态的 三要素
    mysql 基础语法掌握~ This is just the beginning.
    rem ~~ 你懂了吗?
    两个css之间的切换
    JavaScript高级程序设计(第3版)
    保持底部~~永远在底部
    文字要对齐!!!
    改变this不要怕!!!
  • 原文地址:https://www.cnblogs.com/fuhaots2009/p/3429325.html
Copyright © 2020-2023  润新知