hdu 3635 并查集

每个结点除了维护父亲结点编号以外,多维护一个sum值和r值,表示该子树的总结点数(如果该结点是根则sum值有效)以及它到根的距离(即被运输了几次),然后在路径压缩和集合合并的时候顺便维护这两个值即可。

 1 #include <iostream>
 2 #include <cstring>
 3 #include <cstdio>
 4 using namespace std;
 5
 6 const int N = 10001;
 7 int f[N];
 8 int sum[N];
 9 int r[N];
10
11 void init( int n )
12 {
13     for ( int i = 1; i <= n; i++ )
14     {
15         f[i] = i;
16         sum[i] = 1;
17         r[i] = 0;
18     }
19 }
20
21 int findf( int x )
22 {
23     if ( f[x] == x ) return x;
24     int tx = findf(f[x]);
25     r[x] = r[x] + r[f[x]];
26     f[x] = tx;
27     return f[x];
28 }
29
30 void union_set( int x, int y )
31 {
32     x = findf(x), y = findf(y);
33     if ( x == y ) return ;
34     f[x] = y;
35     sum[y] += sum[x];
36     r[x]++;
37 }
38
39 int main ()
40 {
41     int t;
42     scanf("%d", &t);
43     for ( int _case = 1; _case <= t; _case++ )
44     {
45         printf("Case %d:\n", _case);
46         int n, m;
47         scanf("%d%d", &n, &m);
48         init(n);
49         while ( m-- )
50         {
51             char op[2];
52             int x, y;
53             scanf("%s", op);
54             if ( op[0] == ‘T‘ )
55             {
56                 scanf("%d%d", &x, &y);
57                 union_set( x, y );
58             }
59             else
60             {
61                 scanf("%d", &x);
62                 int ans1 = findf(x);
63                 int ans2 = sum[ans1];
64                 int ans3 = r[x];
65                 printf("%d %d %d\n", ans1, ans2, ans3);
66             }
67         }
68     }
69     return 0;
70 }
时间: 2024-10-22 22:13:29

hdu 3635 并查集的相关文章

HDU 1051 并查集+贪心

Wooden Sticks Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 11694    Accepted Submission(s): 4837 Problem Description There is a pile of n wooden sticks. The length and weight of each stick ar

HDU 1512 并查集+左偏树

Monkey King Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 3105    Accepted Submission(s): 1330 Problem Description Once in a forest, there lived N aggressive monkeys. At the beginning, they e

hdu 1829 并查集(食物链的弱化版)

http://acm.hdu.edu.cn/showproblem.php?pid=1829 Problem Description Background  Professor Hopper is researching the sexual behavior of a rare species of bugs. He assumes that they feature two different genders and that they only interact with bugs of

hdu 4514 并查集+树形dp

湫湫系列故事——设计风景线 Time Limit: 6000/3000 MS (Java/Others)    Memory Limit: 65535/32768 K (Java/Others)Total Submission(s): 4539    Accepted Submission(s): 816 Problem Description 随着杭州西湖的知名度的进一步提升,园林规划专家湫湫希望设计出一条新的经典观光线路,根据老板马小腾的指示,新的风景线最好能建成环形,如果没有条件建成环形,

hdu 1856 并查集

http://acm.hdu.edu.cn/showproblem.php?pid=1856 More is better Time Limit: 5000/1000 MS (Java/Others)    Memory Limit: 327680/102400 K (Java/Others)Total Submission(s): 13672    Accepted Submission(s): 5008 Problem Description Mr Wang wants some boys

HDU 1181 并查集 or SPFA

变形课 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 131072/65536 K (Java/Others)Total Submission(s): 12773    Accepted Submission(s): 4733 Problem Description 呃......变形课上Harry碰到了一点小麻烦,因为他并不像Hermione那样能够记住所有的咒语而随意的将一个棒球变成刺猬什么的,但是他发现了变形咒语的一个统一规

hdu 1213 并查集入门

题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=1213 How Many Tables Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submission(s): 12538    Accepted Submission(s): 6145 Problem Description Today is Ignatius' b

HDU 3938 并查集

求小于L的路径点对数(路上的最大值),按权值排序,从小到大并查集建图,有点kruskal的意思. /** @Date : 2017-09-22 17:30:11 * @FileName: HDU 3938 并查集 离线.cpp * @Platform: Windows * @Author : Lweleth ([email protected]) * @Link : https://github.com/ * @Version : $Id$ */ #include <bits/stdc++.h>

HDU 1829 并查集

A Bug's Life Time Limit: 15000/5000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 8224    Accepted Submission(s): 2631 Problem Description Background Professor Hopper is researching the sexual behavior of a rare sp