题解 P1196 [NOI2002]银河英雄传说

luogu

分析

带权并查集模板,用sum数组维护到根的距离,num维护以该点为队头的船齐霸业

Code

#include<bits/stdc++.h>
using namespace std;
int T,ip1,ip2,num[30010],sum[30010],n,fa[30010];;
char op;
int find(int x)
{
    if(fa[x]==x)
        return x;
    int root=find(fa[x]);
    sum[x]+=sum[fa[x]];
    return fa[x]=root;
}
int main()
{
    cin>>T;
    for(int i=1;i<=30000;i++)
    {
        fa[i]=i;
        num[i]=1;
    }
    while(T--)
    {
        cin>>op>>ip1>>ip2;
        int f1=find(ip1);
        int f2=find(ip2);
        if(op=='M')
        {
            sum[f1]+=num[f2];
            fa[f1]=f2;
            num[f2]+=num[f1];
            num[f1]=0;
        }
        if(op=='C')
        {
            if(f1!=f2)
                cout<<-1<<endl;
            else
                cout<<abs(sum[ip1]-sum[ip2])-1<<endl;
        }
    }
}
posted @ 2019-08-28 10:17  G_A_TS  阅读(427)  评论(0编辑  收藏  举报