hdu-3635 Dragon Balls(并查集)

来源:互联网 发布:ps4应用程序数据损坏 编辑:程序博客网 时间:2024/05/01 12:09

题意:

初始化每个城市都有一个龙珠

进行两步操作

T  A  B 就是把A所在的城市的龙珠数都运到城市B中

Q  A   即要输出 A所在的城市 、 A所在城市的个数、A移动的次数

本题貌似不需要把原来A城市的龙珠数清0,每个根节点最多移动一次

#include<stdio.h>#include<string.h>#include<iostream>using namespace std;const int M = 10005;int father[M];int rank[M];int move[M];int n,q;void init(){    for(int i = 0; i <=  n; i++)    {        father[i] = i;        rank[i] = 1;        move[i] = 0;    }}int find(int x)//并查集的精髓&&路径压缩----个人太水至今才明白{    if(x != father[x])    {        int t = father[x];        father[x] = find(father[x]);        move[x] += move[t];    }    return father[x];}void Union(int a,int b){    int x = find(a);    int y = find(b);    if(x!=y)    {        father[x] = y;        rank[y] += rank[x];        move[x] = 1;    }}int main(){    char c;    int t,x,y,Case = 1;;    scanf("%d",&t);    while(t--)    {        printf("Case %d:\n",Case++);        scanf("%d%d",&n,&q);        init();        for(int i = 0; i < q; i++)        {            getchar();            scanf("%c",&c);            if(c == 'T')            {                scanf("%d%d",&x,&y);                Union(x,y);            }            else            {                scanf("%d",&x);                y = find(x);                printf("%d %d %d\n",y,rank[y],move[x]);            }        }    }}


0 0
原创粉丝点击