比赛组队
- 思路:此题讲了冰茶鸡的删点,为了不影响该集合中其它点的连接情况,我们用mom映射实际真实的父亲,然后原父亲继续保持联通(但他的魂已经转到了母亲上了)。
- 代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+5;
int fa[N],mo[N],cnt[N];
int get_fa(int u) {
if(fa[u]==u)return u;
return fa[u]=get_fa(fa[u]);
}
void Update1(int u,int v) {
int fu=get_fa(mo[u]),fv=get_fa(mo[v]);
if(fu!=fv) {
fa[fu]=fv;
cnt[fv]+=cnt[fu];
}
}
void Update2(int u,int v) {
int fu=get_fa(mo[u]),fv=get_fa(mo[v]);
if(fu!=fv) {
mo[u]=fv;
cnt[fv]++,cnt[fu]--;
}
}
int main() {
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) fa[i]=mo[i]=i,cnt[i]=1;
for(int i=1;i<=m;i++) {
int opt,x,y;
scanf("%d%d",&opt,&x);
if(opt==1) {
scanf("%d",&y);
Update1(x,y);
}
else if(opt==2) {
scanf("%d",&y);
Update2(x,y);
}
else {
printf("%d\n",cnt[get_fa(mo[x])]);
}
}
return 0;
}
冷战
队形变换
- 思路:一个集合内的表示一种共性的冰茶鸡(能够互换)