比赛组队

  • 思路:此题讲了冰茶鸡的删点,为了不影响该集合中其它点的连接情况,我们用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;
}

冷战

  • 思路:并查集按秩合并,找u,v所在路径上的最大t

队形变换

  • 思路:一个集合内的表示一种共性的冰茶鸡(能够互换)