思路讲解
unionn的时候把Cnt加过去就行。
1 2 3 4 5 6 7 8 9 10 11 12 13
| inline ll findFa(ll x){ if(fa[x]==x){ return x; } fa[x]=findFa(fa[x]); return fa[x]; } inline void unionn(ll a,ll b){ if(findFa(a)==findFa(b)) return; Cnt[findFa(b)]+=Cnt[findFa(a)]; fa[findFa(a)]=findFa(b); }
|
AC代码
https://www.acwing.com/problem/content/submission/code_detail/38538368/
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74
| #include <iostream> #include <cstring> #include <algorithm> #include <deque> #include <queue> #include <vector> #include <set> #include <map> #include <cmath> #include <bitset> #include <iterator> #include <random> #include <iomanip> #include <cctype> #include <array>
using namespace std; typedef long long ll; const ll N=static_cast<ll>(1e5)+10; ll n,m; ll fa[N],Cnt[N];
inline ll findFa(ll x){ if(fa[x]==x){ return x; } fa[x]=findFa(fa[x]); return fa[x]; } inline void unionn(ll a,ll b){ if(findFa(a)==findFa(b)) return; Cnt[findFa(b)]+=Cnt[findFa(a)]; fa[findFa(a)]=findFa(b); } int main() { ios::sync_with_stdio(false); cin.tie(0);cout.tie(0); cin>>n>>m; for(int i=1;i<=n;++i){ fa[i]=i; Cnt[i]=1; } for(int _=1;_<=m;++_){ string op; ll a,b; cin>>op; if(op[0]=='C'){ cin>>a>>b; unionn(a, b); }else if(op[1]=='1'){ cin>>a>>b; if(findFa(a)==findFa(b)){ cout<<"Yes"<<endl; }else{ cout<<"No"<<endl; } }else{ cin>>a; cout<<Cnt[findFa(a)]<<endl; } } return 0; }
|
心路历程(WA,TLE,MLE……)