• hdu 3635


    题意:起初球i是被放在i号城市的,在年代更迭,世事变迁的情况下,球被转移了,而且转移的时候,连带该城市的所有球都被移动了:T A B(A球所在的城市的所有球都被移动到了B球所在的城市),Q A(问:A球在那城市?A球所在城市有多少个球呢?A球被转移了多少次呢?)。

    这一题还是蛮有意思的,虽然第一次写的时候超时了,因为我没有利用好查找函数的递归性,在合并的时候用一个循环将本来可以在查找时就合并好的,又另外处理的。

    View Code
     1 #include <cstdio>
    2 #include <string>
    3 #define MAX 10010
    4
    5 int rank[MAX];//记录移动的次数
    6 int f[MAX];
    7 int ad[MAX];//记录某城市的球的数量
    8 int n,m;
    9
    10 int find(int x)
    11 {
    12 if(x==f[x])
    13 return x;
    14 int t=find(f[x]);
    15 rank[x] += rank[f[x]] ;
    16 f[x] = t;
    17 return t;
    18 }
    19
    20 void join(int x,int y)
    21 {
    22 if(x == y)
    23 return ;
    24 //int t = f[x];
    25 f[x] = y;
    26 rank[x] = 1;
    27 ad[y] += ad[x] ;
    28 }
    29
    30 int main()
    31 {
    32 int cas;
    33 int num = 1;
    34 scanf("%d",&cas);
    35 while(cas --)
    36 {
    37 scanf("%d%d",&n,&m);
    38 getchar();
    39 memset(rank,0,sizeof(rank));
    40 //memset(ad , 0 ,sizeof(ad));
    41 int i;
    42 for(i = 1;i <= n;i ++)
    43 {
    44 f[i] = i;
    45 ad[i] = 1;
    46 }
    47
    48 char ch;
    49 int a,b,q;
    50 int fa,fb;
    51
    52 printf("Case %d:\n",num ++);
    53 for( i = 0; i < m ; i ++)
    54 {
    55 scanf("%c",&ch);
    56
    57 //printf("*%c\n",ch);
    58 if(ch == 'T')
    59 {
    60 scanf("%d%d",&a,&b);
    61 fa = find(a);
    62 fb = find(b);
    63 join (fa,fb);
    64 getchar();
    65 }
    66 else
    67 {
    68 scanf("%d",&q);
    69 int fq = find(q);
    70 printf("%d %d %d\n",fq,ad[fq],rank[q]);
    71 getchar() ;
    72 }
    73
    74 }
    75 }
    76
    77 return 0;
    78 }
    79
    80
    81
  • 相关阅读:
    基于redis实现滑动窗口式的短信发送接口限流
    Linux 宝塔下的PHP如何与本地的nginx关联
    Linux 下php安装gd库
    Linux Mysql8重置密码
    PHP 无限分级类
    redis 缓存穿透,缓存雪崩,缓存击穿
    yii2 事务添加
    ConcurrentHashMap
    Volatile
    this引用的逸出
  • 原文地址:https://www.cnblogs.com/Shirlies/p/2382118.html
Copyright © 2020-2023  润新知