博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
hdu Dragon Balls
阅读量:6302 次
发布时间:2019-06-22

本文共 1712 字,大约阅读时间需要 5 分钟。

  这题是一道简单的并查集的运用。龙珠所在的城市、该城市龙珠数目都是很简单的问题,稍微麻烦一点的就是龙珠被移动的次数,因为每一次要移动的是一个城市中所有的龙珠,所以每次移动该城市中所有龙珠的移动次数都要加一。

  一开始用二维数组存放每个城市中龙珠的编号,MLE了。接着改用map嵌套queue,却TLE了,不过这个是意料之中的。后来再想想,发现自己有点蠢,其实每个龙珠移动的次数等于它移动的次数加上它根节点移动的次数,这样问题就变得简单了。这就类似于从根节点到当前结点的一个权值累积过程,这时候的Find()函数用递归写会使整个程序变得简单明了。

#include"iostream"#include"stdio.h"#include"string.h"#include"string"#include"algorithm"#include"cmath"#include"vector"#include"queue"#include"map"using namespace std;const int mx=10005;int N,Q;int fa[mx];int move_times[mx];int ball_count[mx];void Set(){    int i;    for(i=1;i<=N;i++)    {        fa[i]=i;        move_times[i]=0;        ball_count[i]=1;    }}int Find(int x){    if(x==fa[x]) return x;    int t=fa[x];    fa[x]=Find(fa[x]);    move_times[x]+=move_times[t];    return fa[x];}void Union(int x,int y){    int fx=Find(x);    int fy=Find(y);    if(fx!=fy)    {        move_times[fx]++;        ball_count[fy]+=ball_count[fx];        //这个可以去掉,因为不可能在像龙珠个数为零的城市移动        ball_count[fx]=0;        fa[fx]=fy;    }}void IO(){    int T,i,m,n,icase=1;;    char ope;    scanf("%d",&T);    while(T--)    {        scanf("%d%d",&N,&Q);        Set();        printf("Case %d:\n",icase++);        while(Q--)        {            getchar();            scanf("%c",&ope);            switch(ope)            {            case 'T':                scanf("%d%d",&m,&n);                Union(m,n);                break;            case 'Q':                scanf("%d",&m);                int fm=Find(m);                printf("%d% d% d\n",fm,ball_count[fm],move_times[m]);                break;            }        }    }}int main(){   // freopen("E:\\in.txt","r",stdin);    IO();    return 0;}
View Code

 

转载于:https://www.cnblogs.com/acm-jing/p/4662844.html

你可能感兴趣的文章
利用反作用力,减负减压轻松快乐学习
查看>>
网络工程原理与实践教程前言
查看>>
什么是指令序和原子操作
查看>>
linux下的sendmail邮件服务的加密与验证
查看>>
如何让 windows 任务计划定时打开网址
查看>>
lvs+keepalived+互相主备
查看>>
小企业sql server数据备份shell脚本解决方案
查看>>
一位牵手腾讯应届毕业生的求职杂谈
查看>>
数据库集群系统研究系列(2)-现存的数据库的解决方案的原理解析
查看>>
「Git」合并多个 Commit
查看>>
DNS原理及其解析过程
查看>>
shell脚本从入门到复杂 其三(传递参数)
查看>>
CISCO 交换机 端口假死
查看>>
linux中uptime(6)命令查看linux系统负载
查看>>
JSP Sevelet如何在控制台输出log?
查看>>
[ Exchange 2016 ] 檢查郵箱容量
查看>>
设置SQL自动重启
查看>>
使用mkpasswd/$RANDOM生成随机密码
查看>>
vlan间互通
查看>>
RabbitMQ入门(1)--介绍
查看>>