难点在于用并查集求与根节点的距离并更新吧。。 遇到过好几次了
#include#include #include #include #include using namespace std;int n, q, fa[10005], num[10005], cou[10005];void init(){ int i; for(i=1; i<=n; i++) fa[i]=i, num[i]=1, cou[i]=0;}int find(int x){ if(x==fa[x]) return x; int tmp=fa[x]; fa[x]=find(fa[x]); cou[x]+=cou[tmp]; return fa[x];}int main(){ int i, j, T, a, b, ta, tb, ri; char op[4]; scanf("%d",&T); for(ri=1; ri<=T; ri++) { scanf("%d%d",&n,&q); init(); printf("Case %d:\n",ri); while(q--) { scanf("%s",op); if(op[0]=='T') { scanf("%d%d",&a,&b); int ta=find(a), tb=find(b); fa[ta]=tb; cou[ta]++; num[tb]+=num[ta]; } else { scanf("%d",&a); ta=find(a); printf("%d %d %d\n",ta,num[ta],cou[a]); } } } return 0;}