zoukankan      html  css  js  c++  java
  • HDU3635Dragon Balls(并查集)

    http://acm.hdu.edu.cn/showproblem.php?pid=3635

    题目意思是说n个球在n个城市。

    每次操作把编号i的球所在的城市的所有的求全部一道另一城市B

    每次询问访问编号i的球的城市,以及这个城市的球的数量,以及这个球被移动了多少次。

    方法就是用一个结构体记录每个球的父节点和移动次数以及这个节点的球的个数(球和城市可以堪为一个整体),然后每次操作就行。

     1 #include <map>
     2 #include <set>
     3 #include <stack>
     4 #include <queue>
     5 #include <cmath>
     6 #include <ctime>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 #define INF 0x3f3f3f3f
    16 #define MAX(a,b) (a > b ? a : b)
    17 #define MIN(a,b) (a < b ? a : b)
    18 #define mem0(a) memset(a,0,sizeof(a))
    19 #define lson k<<1, L, mid
    20 #define rson k<<1|1, mid+1, R
    21 
    22 typedef long long LL;
    23 const double eps = 1e-12;
    24 const int MAXN = 100005;
    25 const int MAXM = 500005;
    26 
    27 struct NODE
    28 {
    29     int num;
    30     int fa;
    31     int time;
    32 }p[MAXN];
    33 int N, Q;
    34 
    35 void init()//初始化
    36 {
    37     for(int i=0;i<=N;i++) {
    38         p[i].fa = i;
    39         p[i].num = 1;
    40         p[i].time = 0;
    41     }
    42 }
    43 
    44 int find(int x)//找父节点
    45 {
    46     if(x == p[x].fa) return x;
    47     int fa = p[x].fa;//记录这个节点的父节点
    48     p[x].fa= find(p[x].fa);
    49     p[x].time += p[fa].time;//这个节点移动的次数加上他父节点次数
    50     return p[x].fa;
    51 }
    52 
    53 void Union(int x, int y)//合并
    54 {
    55     int a = find(x);
    56     int b = find(y);
    57     if(a != b)
    58     {
    59         p[a].fa = p[b].fa;//连边
    60         p[b].num += p[a].num;//龙珠的数量
    61         p[a]. time ++;//a又多移动了一次
    62     }
    63 }
    64 
    65 int main()
    66 {
    67     //freopen("in.txt", "r", stdin);
    68     int T=0, Cas;
    69     scanf("%d", &Cas);
    70     while(Cas--)
    71     {
    72         scanf("%d%d%*c", &N, &Q);
    73         init();
    74         char ch; int a, b;
    75         printf("Case %d:
    ", ++T);
    76         for(int i=0;i<Q;i++)
    77         {
    78             scanf("%c", &ch);
    79             if(ch == 'T') {
    80                 scanf("%d %d%*c", &a, &b);
    81                 Union(a, b);
    82             }
    83             else {
    84                 scanf("%d%*c", &a);
    85                 b = find(a);//必须先找一遍他被移动了多少次
    86                 printf("%d %d %d
    ", b, p[b].num, p[a].time);
    87             }
    88         }
    89     }
    90     return 0;
    91 }

    但是我把树的层数减少那步去掉后字节搜索层数居然和这个没什么区别,只能说数据太弱了= =

     1 #include <map>
     2 #include <set>
     3 #include <stack>
     4 #include <queue>
     5 #include <cmath>
     6 #include <ctime>
     7 #include <vector>
     8 #include <cstdio>
     9 #include <cctype>
    10 #include <cstring>
    11 #include <cstdlib>
    12 #include <iostream>
    13 #include <algorithm>
    14 using namespace std;
    15 #define INF 0x3f3f3f3f
    16 #define MAX(a,b) (a > b ? a : b)
    17 #define MIN(a,b) (a < b ? a : b)
    18 #define mem0(a) memset(a,0,sizeof(a))
    19 #define lson k<<1, L, mid
    20 #define rson k<<1|1, mid+1, R
    21 
    22 typedef long long LL;
    23 const double eps = 1e-12;
    24 const int MAXN = 100005;
    25 const int MAXM = 500005;
    26 
    27 struct NODE
    28 {
    29     int num;
    30     int fa;
    31 }p[MAXN];
    32 int N, Q;
    33 
    34 void init()
    35 {
    36     for(int i=0;i<=N;i++) {
    37         p[i].fa = i;
    38         p[i].num = 1;
    39     }
    40 }
    41 
    42 int find(int x)
    43 {
    44     if(x == p[x].fa) return x;
    45     return find(p[x].fa);
    46 }
    47 
    48 void Union(int x, int y)
    49 {
    50     int a = find(x);
    51     int b = find(y);
    52     if(a != b)
    53     {
    54         p[a].fa = b;
    55         p[b].num += p[a].num;
    56     }
    57 }
    58 
    59 int main()
    60 {
    61     int T=0, Cas;
    62     scanf("%d", &Cas);
    63     while(Cas--)
    64     {
    65         scanf("%d%d%*c", &N, &Q);
    66         init();
    67         char ch; int a, b;
    68         printf("Case %d:
    ", ++T);
    69         for(int i=0;i<Q;i++)
    70         {
    71             scanf("%c", &ch);
    72             if(ch == 'T') {
    73                 scanf("%d %d%*c", &a, &b);
    74                 Union(a, b);
    75             }
    76             else {
    77                 int time = 0;
    78                 scanf("%d%*c", &a);
    79                 while(a != p[a].fa){ time ++; a = p[a].fa; }
    80                 printf("%d %d %d
    ", a, p[a].num, time);
    81             }
    82         }
    83     }
    84     return 0;
    85 }
  • 相关阅读:
    史上最完整的Android开发工具集合(转)
    史上最完整的Android开发工具集合(转)
    JSP取得绝对路径
    ExecutorService 的理解与使用
    JAVA多线程实现的三种方式 ()
    高并发策略实例分析
    spring framework体系结构及内部各模块jar之间的maven依赖关系
    js 去掉下划线,后首个字母变大写
    Cron表达式
    eclipse中怎么找项目部署的路径和找编译后的class路径
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/3452027.html
Copyright © 2011-2022 走看看