結果
問題 | No.2286 Join Hands |
ユーザー |
|
提出日時 | 2024-03-17 10:27:41 |
言語 | C++17 (gcc 13.3.0 + boost 1.87.0) |
結果 |
AC
|
実行時間 | 55 ms / 2,000 ms |
コード長 | 2,105 bytes |
コンパイル時間 | 2,126 ms |
コンパイル使用メモリ | 194,596 KB |
最終ジャッジ日時 | 2025-02-20 07:00:39 |
ジャッジサーバーID (参考情報) |
judge1 / judge2 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 3 |
other | AC * 58 |
ソースコード
#include <bits/stdc++.h>using namespace std;const int N = 5e4 + 10;int hd[10010], to[N], nx[N], W[N], tt = 1;void add(int u, int v, int f) { to[++tt] = v, nx[tt] = hd[u], hd[u] = tt, W[tt] = f; }void link(int u, int v, int f) { add(u, v, f), add(v, u, 0); }int dep[N], cur[10010], q[N], l, r, S, T;bool bfs() {q[l = r = 1] = S;memset(dep, 0, sizeof dep);dep[S] = 1;memcpy(cur, hd, sizeof cur);while (l <= r) {int u = q[l++];// cerr<<"POP: "<<u<<endl;for (int i = hd[u]; i; i = nx[i]) {int v = to[i];// cerr<<u<<"->"<<i<<" "<<W[i]<<" "<<v<<" "<<dep[v]<<endl;if (W[i] && !dep[v]) {dep[v] = dep[u] + 1;q[++r] = v;}}}return dep[T];}int dfs(int u, int f) {// cerr<<"DFS: "<<u<<" "<<f<<endl;if (u == T)return f;int r = 0, k;for (int& i = cur[u]; i; i = nx[i]) {int v = to[i];if (dep[v] == dep[u] + 1 && W[i]) {k = dfs(v, min(f, W[i]));r += k, f -= k;W[i] -= k, W[i ^ 1] += k;}}return r;}int Dinic() {int flow = 0;while (bfs()) /*cerr<<flow<<" : ",*/flow += dfs(S, 0x3f3f3f3f);return flow;}int ban[N];int main() {cin.tie(0)->sync_with_stdio(0);int C, Tr=1;while (Tr--) {int n, m;cin >> n >> m;tt = 1, S = n * 2 + 1, T = n * 2 + 2;memset(hd, 0, sizeof hd);memset(ban, 0, sizeof ban);for (int i = 1; i <= n; ++i) link(S, i, 1);for (int i = 1; i <= n; ++i) link(n + i, T, 1);while (m--) {int u, v;cin >> u >> v;link(u, v + n, 1);link(v, u + n, 1);ban[u] = ban[v] = 1;}int cnt = 0;for (int i = 1; i <= n; ++i) cnt += !ban[i];int res = Dinic();if (cnt == 1 && res == n - 1) {res--;// cerr<<"!!\n";}// cerr<<res<<endl;cout << res * 2 - n << endl;}return 0;}