很久没写并查集了,发现这道没写过,早上交的现在还在waiting~ 只有再交一次咯~ #include<cstdio> #include<cstring> using namespace std; const int maxn=30005; int fa[maxn],root[maxn],dis[maxn];//父节点,作为根时树的节点数,距树根的距离 int p; int find(int i) { int tmp; if (fa[i]==i) return i; tmp=find(fa[i]);//记录之前的父节点,跟新距离 dis[i]+=dis[fa[i]];//距离增加 fa[i]=tmp; return tmp; } void Union(int i,int j)//将j连到i下面 { int fi=find(i),fj=find(j); fa[fj]=fi; dis[fj]=root[fi]; root[fi]+=root[fj]; } void init() { for (int i=1;i<=maxn-5;i++){//初始化 fa[i]=i; root[i]=1; dis[i]=0; } } int main() { int i,a,b; char op[5]; while (scanf("%d",&p)!=EOF){ init(); for (i=0;i<p;i++){ scanf("%s",op); if (op[0]=='M'){ scanf("%d%d",&a,&b); Union(a,b); } else { scanf("%d",&a); printf("%d/n",root[find(a)]-dis[a]-1); } // for (int j=1;j<=10;j++) // printf("i=%d fa=%d dis=%d root=%d/n",j,fa[j],dis[j],root[j]); } } return 0; }