HDU - 3635 Dragon Balls

来源:互联网 发布:vscode搭建kotlin 编辑:程序博客网 时间:2024/05/16 07:38
#include<iostream>#include <stdio.h>#include <algorithm>#include <string.h>using namespace std;int f[10005],ti[10005];int find(int x){    if(f[x]<0) return x;    else    {        int tt=f[x];        f[x]=find(f[x]);        ti[x]+=ti[tt];        return f[x];    }    }int main(){    int t,tt=0;    scanf("%d",&t);    while(t--)    {        printf("Case %d:\n",++tt);        int n,m;        scanf("%d%d",&n,&m);        for(int i=1;i<=n;++i)        {f[i]=-1;ti[i]=0;}        for(int i=0;i<m;i++)        {                        char ch;            scanf(" %c",&ch);            if(ch=='T')            {                int a,b;                scanf("%d%d",&a,&b);               int fa=find(a),fb=find(b);                if(fa!=fb)                {                     f[fb]+=f[fa];                     f[fa]=fb;                     ti[fa]++;                }            }            if(ch=='Q')            {                int a;                scanf("%d",&a);                int fa=find(a);                printf("%d %d %d\n",fa,-f[fa],ti[a]);            }        }    }    return 0;}

本来以为自己对并查集已经很了解了 没想到WA了那么久    题目不难 要注意搬迁的次数完全取决于根节点移动的次数 而根节点移动的次数又取决于其根节点的移动次数 有点像递归
0 0
原创粉丝点击