• 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 }
  • 相关阅读:
    【JavaWeb】Spring+SpringMVC+MyBatis+SpringSecurity+EhCache+JCaptcha 完整Web基础框架(前言)
    【CityHunter】游戏流程设计及技术要点
    lua table操作
    python线程池(转)
    windows通过企业内部授权服务器激活方法
    贝叶斯定理(转)
    python 日期计算
    python 过滤 b'及提取 cmd命令返回值
    python 连接MySQL数据库
    python 获取昨天的日期
  • 原文地址:https://www.cnblogs.com/gj-Acit/p/3452027.html
Copyright © 2020-2023  润新知