結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| ユーザー |
hrbt__
|
| 提出日時 | 2020-03-09 18:58:45 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.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 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#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;
}
}
hrbt__