結果
問題 | No.977 アリス仕掛けの摩天楼 |
ユーザー | hrbt__ |
提出日時 | 2020-03-09 18:58:45 |
言語 | C++14 (gcc 12.3.0 + boost 1.83.0) |
結果 |
AC
|
実行時間 | 143 ms / 2,000 ms |
コード長 | 2,313 bytes |
コンパイル時間 | 2,034 ms |
コンパイル使用メモリ | 180,552 KB |
実行使用メモリ | 14,720 KB |
最終ジャッジ日時 | 2024-11-08 18:45:03 |
合計ジャッジ時間 | 3,771 ms |
ジャッジサーバーID (参考情報) |
judge4 / judge3 |
(要ログイン)
テストケース
テストケース表示入力 | 結果 | 実行時間 実行使用メモリ |
---|---|---|
testcase_00 | AC | 2 ms
5,248 KB |
testcase_01 | AC | 2 ms
5,248 KB |
testcase_02 | AC | 2 ms
5,248 KB |
testcase_03 | AC | 2 ms
5,248 KB |
testcase_04 | AC | 2 ms
5,248 KB |
testcase_05 | AC | 2 ms
5,248 KB |
testcase_06 | AC | 1 ms
5,248 KB |
testcase_07 | AC | 2 ms
5,248 KB |
testcase_08 | AC | 2 ms
5,248 KB |
testcase_09 | AC | 2 ms
5,248 KB |
testcase_10 | AC | 2 ms
5,248 KB |
testcase_11 | AC | 2 ms
5,248 KB |
testcase_12 | AC | 2 ms
5,248 KB |
testcase_13 | AC | 12 ms
5,248 KB |
testcase_14 | AC | 11 ms
5,248 KB |
testcase_15 | AC | 10 ms
5,248 KB |
testcase_16 | AC | 12 ms
5,248 KB |
testcase_17 | AC | 10 ms
5,248 KB |
testcase_18 | AC | 36 ms
6,656 KB |
testcase_19 | AC | 29 ms
8,064 KB |
testcase_20 | AC | 42 ms
7,424 KB |
testcase_21 | AC | 67 ms
8,192 KB |
testcase_22 | AC | 90 ms
9,728 KB |
testcase_23 | AC | 143 ms
14,592 KB |
testcase_24 | AC | 134 ms
14,720 KB |
testcase_25 | AC | 138 ms
14,592 KB |
ソースコード
#include <bits/stdc++.h> using namespace std; struct BiconnectedComponents { int n; int time; vector<bool> is_art_point; vector<int> idx, low; set<pair<int, int>> bridges; vector<vector<int>> g; BiconnectedComponents(int _n) : n(_n), time(0), is_art_point(_n, false), idx(_n, -1), low(_n, -1), g(_n) {} void add_edge(int u, int v) { g[u].push_back(v); g[v].push_back(u); } void build() { for (int i = 0; i < n; ++i) { if (idx[i] == -1) dfs(i, -1); } } void dfs(int u, int p) { idx[u] = low[u] = time++; for (auto&& v : g[u]) { if (idx[v] == -1) { dfs(v, u); low[u] = min(low[u], low[v]); if (idx[u] <= low[v]) is_art_point[u] = (idx[u] > 0) || (idx[v] > 1); if (idx[u] < low[v]) bridges.insert({min(u, v), max(u, v)}); } else if (v != p) { low[u] = min(low[u], idx[v]); } } } }; struct UnionFind { vector<int> data; UnionFind(int n) : data(n, -1) {} inline int root(int x) { return (data[x] < 0) ? x : data[x] = root(data[x]); } inline int size(int x) { return -data[root(x)]; } inline bool same(int x, int y) { return root(x) == root(y); } bool unite(int x, int y) { x = root(x); y = root(y); if (x == y) return false; if (data[x] > data[y]) swap(x, y); data[x] += data[y]; data[y] = x; return true; } }; int main() { int n; cin >> n; BiconnectedComponents g(n); UnionFind uf(n); for (int i = 0; i < n - 1; i++) { int u, v; cin >> u >> v; g.add_edge(u, v); uf.unite(u, v); } g.build(); int cnt = 0; vector<bool> used(n, false); for (int i = 0; i < n; i++) { if (used[uf.root(i)]) continue; used[uf.root(i)] = true; cnt++; } if (cnt <= 1) { cout << "Bob" << endl; return 0; } if (cnt >= 3) { cout << "Alice" << endl; return 0; } if (g.bridges.size() > 1) { cout << "Alice" << endl; } else { cout << "Bob" << endl; } }