zoukankan      html  css  js  c++  java
  • hdu 3635(并查集)

    Dragon Balls

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 5335    Accepted Submission(s): 2009


    Problem Description
    Five hundred years later, the number of dragon balls will increase unexpectedly, so it's too difficult for Monkey King(WuKong) to gather all of the dragon balls together.

    His country has N cities and there are exactly N dragon balls in the world. At first, for the ith dragon ball, the sacred dragon will puts it in the ith city. Through long years, some cities' dragon ball(s) would be transported to other cities. To save physical strength WuKong plans to take Flying Nimbus Cloud, a magical flying cloud to gather dragon balls.
    Every time WuKong will collect the information of one dragon ball, he will ask you the information of that ball. You must tell him which city the ball is located and how many dragon balls are there in that city, you also need to tell him how many times the ball has been transported so far.
     
    Input
    The first line of the input is a single positive integer T(0 < T <= 100).
    For each case, the first line contains two integers: N and Q (2 < N <= 10000 , 2 < Q <= 10000).
    Each of the following Q lines contains either a fact or a question as the follow format:
      T A B : All the dragon balls which are in the same city with A have been transported to the city the Bth ball in. You can assume that the two cities are different.
      Q A : WuKong want to know X (the id of the city Ath ball is in), Y (the count of balls in Xth city) and Z (the tranporting times of the Ath ball). (1 <= A, B <= N)
     
    Output
    For each test case, output the test case number formated as sample output. Then for each query, output a line with three integers X Y Z saparated by a blank space.
     
    Sample Input
    2 3 3 T 1 2 T 3 2 Q 2 3 4 T 1 2 Q 1 T 1 3 Q 1
     
    Sample Output
    Case 1: 2 3 0 Case 2: 2 2 1 3 3 2
     
    题意:有n个城市,每个城市都有一个龙珠,一次T a b操作表示将a城市里面的龙珠全部转移到b城市,一次Q a操作表示问a龙珠当前在几号城市,这个城市有多少龙珠,以及龙珠
    被转移了多少次。
    题解:这个题难点在于计算龙珠的转移次数..要在状态压缩里面做。。我怎么没想到 - - 还有就是记录前结点一直往上找的方法。
    #include <stdio.h>
    #include <algorithm>
    #include <string.h>
    #include <map>
    using namespace std;
    const int N =10005;
    int father[N];
    int sum[N]; ///记录每个城市龙珠的个数
    int mov[N]; ///记录每个点的移动次数
    int _find(int x){
        if(x!=father[x]){ ///路径压缩更新
            int t = father[x];
            father[x] = _find(father[x]);
            mov[x]+=mov[t];
        }
        return father[x];
    }
    void Union(int a,int b){
        int x = _find(a);
        int y = _find(b);
        if(x!=y){
            father[x] = y;
            mov[x]++;
            sum[y]+=sum[x];
            sum[x] = 0; ///记得清0
        }
    }
    int main()
    {
        int tcase;
        int t = 1;
        scanf("%d",&tcase);
        while(tcase--){
            printf("Case %d:
    ",t++);
            int n,m;
            scanf("%d%d",&n,&m);
            for(int i=1;i<=n;i++){
                father[i] = i;
                sum[i] = 1;
                mov[i] = 0;
            }
            while(m--){
                char s[2];
                scanf("%s",s);
                if(s[0]=='T'){
                    int a,b;
                    scanf("%d%d",&a,&b);
                    Union(a,b);
                }
                else{
                    int a;
                    scanf("%d",&a);
                    int b = _find(a);
                    printf("%d %d %d
    ",b,sum[b],mov[a]);
                }
            }
        }
        return 0;
    }
  • 相关阅读:
    static inline和inline的区别——stm32实测
    实现自动构建编译javaweb项目并发布到N台服务器
    手把手教你用Mysql-Cluster-7.5搭建数据库集群
    HAProxy实现mysql负载均衡
    使用LVS+keepalived实现mysql负载均衡的实践和总结
    阿里巴巴Java开发手册———总结
    阿里巴巴Java开发手册———个人追加的见解和补充(五)
    阿里巴巴Java开发手册———个人追加的见解和补充(四)
    Chapter 3 Phenomenon——24
    阿里巴巴Java开发手册———个人追加的见解和补充(三)
  • 原文地址:https://www.cnblogs.com/liyinggang/p/5479364.html
Copyright © 2011-2022 走看看