結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| ユーザー |
Chanyuh
|
| 提出日時 | 2020-02-01 20:45:44 |
| 言語 | C++11(廃止可能性あり) (gcc 13.3.0) |
| 結果 |
WA
|
| 実行時間 | - |
| コード長 | 4,779 bytes |
| コンパイル時間 | 1,360 ms |
| コンパイル使用メモリ | 125,088 KB |
| 実行使用メモリ | 13,056 KB |
| 最終ジャッジ日時 | 2024-09-18 20:17:26 |
| 合計ジャッジ時間 | 2,348 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge3 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 24 WA * 2 |
ソースコード
#include<iostream>
#include<string>
#include<cstdio>
#include<vector>
#include<cmath>
#include<algorithm>
#include<functional>
#include<iomanip>
#include<queue>
#include<ciso646>
#include<random>
#include<map>
#include<set>
#include<complex>
#include<bitset>
#include<stack>
#include<unordered_map>
#include<utility>
#include<tuple>
using namespace std;
typedef long long ll;
typedef unsigned int ui;
const ll mod = 1000000007;
const ll INF = (ll)1000000007 * 1000000007;
typedef pair<int, int> P;
#define stop char nyaa;cin>>nyaa;
#define rep(i,n) for(int i=0;i<n;i++)
#define per(i,n) for(int i=n-1;i>=0;i--)
#define Rep(i,sta,n) for(int i=sta;i<n;i++)
#define Per(i,sta,n) for(int i=n-1;i>=sta;i--)
#define rep1(i,n) for(int i=1;i<=n;i++)
#define per1(i,n) for(int i=n;i>=1;i--)
#define Rep1(i,sta,n) for(int i=sta;i<=n;i++)
typedef long double ld;
typedef complex<ld> Point;
const ld eps = 1e-8;
const ld pi = acos(-1.0);
typedef pair<ll, ll> LP;
struct UnionFind {
private:
vector<int> par,ran;
int n;
public:
vector<int> edge,size;
UnionFind(int x){
n=x;
par.resize(n,0);
ran.resize(n,0);
edge.resize(n,0);
size.resize(n,1);
rep(i,n){
par[i]=i;
}
}
int find(int x) {
if (par[x]==x)return x;
else return par[x]=find(par[x]);
}
void unite(int x, int y) {
x=find(x),y=find(y);
if (x==y){
edge[x]++;
return;
}
if (ran[x]<ran[y]) {
par[x]=y;
size[y]+=size[x];
edge[y]+=edge[x]+1;
}
else {
par[y]=x;
size[x]+=size[y];
edge[x]+=edge[y]+1;
if (ran[x]==ran[y])ran[x]++;
}
}
bool same(int x,int y) {
return find(x)==find(y);
}
};
struct LowLink{
int n,pos;
vector<int> ord,low,par,blg,num;
vector<bool> root;
vector<vector<int> > G,C,T;
vector<vector<pair<int, int> > > E;
vector<int> ap;
vector<pair<int, int> > bs,cand;
LowLink(int n):n(n),pos(0),ord(n,-1),low(n),root(n),
par(n,-1),blg(n,-1),num(n,1),G(n){}
void add_edge(int u,int v){
G[u].emplace_back(v);
G[v].emplace_back(u);
}
bool is_joint(int u){
if (root[u]) return G[u].size()>=2;
else{
for(int v:G[u]){
if(ord[u]<=low[v]){
return true;
}
}
return false;
}
}
bool is_bridge(int u,int v){
if(ord[u]>ord[v]) swap(u,v);
return ord[u]<low[v];
}
void dfs(int v){
ord[v]=low[v]=pos++;
for(int u:G[v]){
if(u==par[v]) continue;
if(ord[u]<ord[v])
cand.emplace_back(min(u,v),max(u,v));
if(~ord[u]){
low[v]=min(low[v],ord[u]);
continue;
}
par[u]=v;
dfs(u);
num[v]+=num[u];
low[v]=min(low[v],low[u]);
if(is_bridge(u,v)) bs.emplace_back(u,v);
if(low[u]>=ord[v]){
E.emplace_back();
while(1){
auto e=cand.back();
cand.pop_back();
E.back().emplace_back(e);
if(make_pair(min(u,v),max(u,v))==e) break;
}
}
}
}
void fill_component(int v){
C[blg[v]].emplace_back(v);
for(int u:G[v]){
if(~blg[u]||is_bridge(u,v)) continue;
blg[u]=blg[v];
fill_component(u);
}
}
void add_component(int v,int &k){
if(~blg[v]) return;
blg[v]=k++;
C.emplace_back();
fill_component(v);
}
int build(){
for(int i=0;i<n;i++)
if(ord[i]<0) {
dfs(i);
root[i]=true;
}
vector<int> cnt(n,0);
for(int i=0;i<n;i++){
int p=par[i];
if(p<0) continue;
if(par[p]<0) cnt[p]++;
else if(ord[p]<=low[i]) ap.emplace_back(p);
}
for(int i=0;i<n;i++)
if(cnt[i]>1) ap.emplace_back(i);
sort(ap.begin(),ap.end());
ap.erase(unique(ap.begin(),ap.end()),ap.end());
int k=0;
for(int i=0;i<n;i++) add_component(i,k);
T.assign(k,vector<int>());
for(auto e:bs){
int u=blg[e.first],v=blg[e.second];
T[u].emplace_back(v);
T[v].emplace_back(u);
}
return k;
}
};
int n;
P E[100010];
void solve(){
cin >> n;
LowLink low(n);UnionFind uf(n);
rep(i,n-1){
int u,v;
cin >> u >> v;
E[i]=P(u,v);
low.add_edge(u,v);
uf.unite(u,v);
}
set<int> S{};
rep(i,n){
S.insert(uf.find(i));
}
int size=S.size();
//cout << size << endl;
if (size==1) cout << "Bob" << endl;
if (size>=3) cout << "Alice" << endl;
if (size==2){
rep(i,n-1){
if (low.is_bridge(E[i].first,E[i].second)) {
cout << "Alice" << endl;
return;
}
}
cout << "Bob" << endl;
}
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout << fixed << setprecision(50);
solve();
}
Chanyuh