開啟章節選單

1660 Cable TV Network

程式碼

// author: Piau
#include <bits/stdc++.h>
using namespace std;

#define INF LONG_LONG_MAX/1000
#define WA() cin.tie(0)->sync_with_stdio(0)
#define all(x) (x).begin(), (x).end()
#define int long long

vector<int> dep, cur;
vector<vector<int>> g, bu;
int n, m, s, t;

bool bfs() {
    fill(all(dep), -1); dep[s] = 0;
    queue<int> q; q.push(s);
    while (q.size()) { // u -> v
        int u = q.front(); q.pop();
        for (int v = 0; v < n*2; v++) if (g[u][v] && !~dep[v]) {
            dep[v] = dep[u]+1;
            q.push(v);
        }
    }
    return ~dep[t];
}

int dfs(int u, int mn) {
    if (!mn) return 0;
    if (u == t) return mn;

    for (int &v = cur[u]; v < n*2; v++) {
        if (dep[u]+1 == dep[v] && g[u][v]) {
            if (int go = dfs(v, min(mn, g[u][v]))) {
                g[u][v] -= go;
                g[v][u] += go;
                return go;
            }
        }
    }
    return 0;
}

int dinic() {
    int flow = 0;
    while (bfs()) {
        fill(all(cur), 0);
        while (int go = dfs(s, INF)) flow += go;
    }
    return flow;
}

signed main() { WA();
    for (; cin >> n >> m;) {
        g.assign(n*2, vector<int>(n*2, 0));
        dep.assign(n*2, 0);
        cur.assign(n*2, 0);
        for (int i = 0; i < n; i++) g[i][i+n] = 1;
        for (int k = m; k--;) {
            char c; int a, b;
            cin >> c >> a >> c >> b >> c;
            g[a+n][b] = INF;
            g[b+n][a] = INF;
        } bu = g;
        int ans = n;
        for (int i = 0; i < n; i++) {
            for (int j = i+1; j < n; j++) {
                g = bu;
                s = i+n; t = j;
                ans = min(ans, dinic());
            }
        }
        cout << ans << '\n';
    }
}