UVa 10330 - Power Transmission (最大流 & Edmonds - Karp)

题意

题目看了好久才懂。

有N个发电厂,每个发电厂容量为C,有K个目的地,也有容量。给出每个发电厂连接的路和路的容量,求最大能云的电。

思路

网络流第一题,惯例看代码。

建立超级源点和超级汇点,然后EK。

晚上还要仔细理解一下EK。

代码

#include <cstdio>
#include <stack>
#include <set>
#include <iostream>
#include <string>
#include <vector>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
#include <ctime>
#include <cstdlib>
#include <fstream>
#include <string>
#include <sstream>
#include <map>
#include <cmath>
#define LL long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(arr, num) memset(arr, num, sizeof(arr))
#define PB push_back
#define F first
#define S second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define BitCount(x) __builtin_popcount(x)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
using namespace std;
const int MAXN = 110 + 5;
const int MOD = 20071027;
 
typedef pair<int, int> pii;
typedef vector<int>::iterator viti;
typedef vector<pii>::iterator vitii;
 
int a[MAXN], flow[MAXN][MAXN], cap[MAXN][MAXN], num[MAXN], p[MAXN];
int f, n;
 
void EK()
{
    queue<int> qu;
    MS(flow, 0);
    f = 0;
    while (true)
    {
        MS(a, 0);
        a[0] = INF;
        qu.push(0);
        while (!qu.empty())
        {
            int u = qu.front(); qu.pop();
            for (int v = 0; v <= n + 1; v++)
            {
                if (!a[v] && cap[u][v] > flow[u][v])
                {
                    p[v] = u;
                    qu.push(v);
                    a[v] = min(a[u], cap[u][v] - flow[u][v]);
                }
            }
        }
        if (!a[n + 1]) break;
        for (int u = n + 1; u; u = p[u])
        {
            flow[p[u]][u] += a[n + 1];
            flow[u][p[u]] -= a[n + 1];
        }
        f += a[n + 1];
    }
}
 
int main()
{
    //ROP;
    int i, j, tmp;
    while (~scanf("%d", &n))
    {
        MS(cap, 0);
        for (i = 1; i <= n; i++) scanf("%d", #[i]);
        int _, a, b, c;
        scanf("%d", &_);
        while (_--)
        {
            scanf("%d%d%d", &a, &b, &c);
            cap[a][b] = min(c, min(num[a], num[b]));
        }
        int d;
        scanf("%d%d", &b, &d);
        while (b--)
        {
            scanf("%d", &tmp);
            cap[0][tmp] = num[tmp];
        }
        while (d--)
        {
            scanf("%d", &tmp);
            cap[tmp][n + 1] = num[tmp];
        }
        EK();
        printf("%d\n", f);
    }
    return 0;
}

Powered by Jekyll and Theme by solid