開啟章節選單
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'; } }