結果
| 問題 |
No.977 アリス仕掛けの摩天楼
|
| ユーザー |
iomir
|
| 提出日時 | 2023-03-27 11:00:18 |
| 言語 | C++14 (gcc 13.3.0 + boost 1.87.0) |
| 結果 |
AC
|
| 実行時間 | 66 ms / 2,000 ms |
| コード長 | 1,488 bytes |
| コンパイル時間 | 1,709 ms |
| コンパイル使用メモリ | 172,344 KB |
| 実行使用メモリ | 7,168 KB |
| 最終ジャッジ日時 | 2024-09-19 10:09:00 |
| 合計ジャッジ時間 | 3,241 ms |
|
ジャッジサーバーID (参考情報) |
judge5 / judge1 |
(要ログイン)
| ファイルパターン | 結果 |
|---|---|
| other | AC * 26 |
ソースコード
#include<bits/stdc++.h>
using namespace std;
#define all(v) v.begin(),v.end()
using ll = long long;
using ull = unsigned long long;
using vll=vector<ll>;
using vvll = vector<vector<ll>>;
vector<ll> par,Rank;
struct unionfind{
ll N;
vector<ll> par,Rank,Size;
unionfind(ll n):N(n){
par=vector<ll>(N),Rank=vector<ll>(N,1),Size=vector<ll>(N,1);
for(int i=0;i<N;i++) par[i]=i;
};
ll find(ll x){
if(par[x]==x) return x;
else return par[x]=find(par[x]);
}
bool same(ll a,ll b){
return find(a)==find(b);
}
void unite(ll a,ll b){
if(same(a,b))return;
a=find(a);
b=find(b);
ll s=Size[a]+Size[b];
if(Rank[b]>Rank[a]) par[a]=b;
else par[b]=a;
if(Rank[a]==Rank[b]) Rank[a]++;
Size[find(a)]=s;
}
ll size(ll a){
return Size[find(a)];
}
};
int main(){
ll N;
cin>>N;
unionfind uf(N);
vll A(N);
for(int i=0;i<N-1;i++){
ll a,b;
cin>>a>>b;
uf.unite(a,b);
A[a]++;A[b]++;
}
ll cnt=0;
vll c(N+1);
for(int i=0;i<N;i++){
if(i==uf.find(i))cnt++,c[uf.size(i)]++;
}
if(cnt==1){
cout << "Bob" << endl;
return 0;
}
for(int i=0;i<N;i++){
if(A[i]==1){
cout << "Alice" << endl;
return 0;
}
}
if(cnt==2&&c[1]==1){
cout << "Bob" << endl;
return 0;
}
cout << "Alice" << endl;
}
iomir