結果
問題 | No.2403 "Eight" Bridges of Königsberg |
ユーザー |
![]() |
提出日時 | 2023-08-04 23:22:23 |
言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
結果 |
WA
|
実行時間 | - |
コード長 | 1,905 bytes |
コンパイル時間 | 1,568 ms |
コンパイル使用メモリ | 173,504 KB |
実行使用メモリ | 6,656 KB |
最終ジャッジ日時 | 2024-10-14 21:35:11 |
合計ジャッジ時間 | 3,659 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
ファイルパターン | 結果 |
---|---|
sample | AC * 4 |
other | AC * 25 WA * 6 |
ソースコード
#include <bits/stdc++.h>using namespace std;using ll = long long;class UnionFind{int n;vector<int> parent;vector<int> edgeCnt;public:UnionFind(int n_) : n(n_){parent.resize(n);edgeCnt.resize(n, 0);iota(parent.begin(), parent.end(), 0);}int find(int x){int y = parent[x];if (y != parent[y]){y = find(y);}return parent[x] = y;}void unite(int a, int b){int x = find(a);int y = find(b);if (x != y){parent[y] = x;edgeCnt[x] = edgeCnt[y] + 1;}else{edgeCnt[x]++;}}bool same(int a, int b){return find(a) == find(b);}int EdgeCnt(int i){return edgeCnt[i];}};int main(){int N, M;cin >> N >> M;vector<int> u(M), v(M);vector<int> inDegree(N, 0);vector<int> outDegree(N, 0);UnionFind uf(N);for (int i = 0; i < M; i++){cin >> u[i] >> v[i];u[i]--;v[i]--;inDegree[v[i]]++;outDegree[u[i]]++;uf.unite(u[i], v[i]);}int ans = 0;vector<int> cnt(N, 0);for (int i = 0; i < N; i++){ans += abs(inDegree[i] - outDegree[i]);cnt[uf.find(i)] += abs(inDegree[i] - outDegree[i]);}int group = 0;for (int i = 0; i < N; i++){if (uf.find(i) == i){if (uf.EdgeCnt(i) > 0){group++;}}}ans /= 2;int flag = 0;for (int i = 0; i < N; i++){if (cnt[i] >= 4){flag++;}}if (flag == 1){cout << max({0, ans - 1, group}) << endl;}else{cout << max({0, ans - 1, group - 1}) << endl;}}