题目链接:https://cn.vjudge.net/contest/161621#problem/D
题目的意思是说给你一个森林,两个操作,1是去掉与他父亲的连边,2是查询xy是否在同一个连通块里面。
我们使用并查集,逆序来,把去边变为加边,然后判断连通性。队友敲得代码
代码:
#include <bits/stdc++.h> using namespace std; const int MAXN=20005; int n,m,k; int root; int pre[MAXN]; char s[2]; int findx(int u){ while(pre[u])u=pre[u]; return u; } int main(){ int t; scanf("%d",&t); int ca=0,u,v; while(t--){ ca++; scanf("%d%d",&n,&k); for(int i=1; i<=n; ++i){ scanf("%d",&pre[i]); } printf("Case #%d:\n",ca); while(k--){ scanf("%s",s); if(s[0]=='Q'){ scanf("%d%d",&u,&v); if(findx(u)==findx(v))puts("YES"); else puts("NO"); } else{ scanf("%d",&v); pre[v]=0; } } } return 0; }