博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【poj 1962】Corporative Network(图论--带权并查集 模版题)
阅读量:6319 次
发布时间:2019-06-22

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

P.S.我不想看英文原题的,但是看网上题解的题意看得我 炒鸡辛苦&一脸懵 +_+,打这模版题的代码也纠结至极了......不得已只能自己翻译了QwQ 。

题意:有一个公司有N个企业,分成几个网络,分别从各个网络中选一个机器设置为中心机。下面有2种操作:1.查询当前时间机器x到其所在网络的中心机的距离;2.设置中心机x与机器y相连,距离为abs(x-y)%1000,x所在的网络的中心机变为y所在网络的中心机。

解法:带权并查集。可以把中心机转换为一个集合(树)的根节点,求距离就是求点到根节点的距离。于是我们就做并查集的同时维护一个f[i]表示点 i 到其根节点的距离。

请画树理解代码,图解可参考:

1 #include
2 #include
3 #include
4 #include
5 using namespace std; 6 7 const int N=20010,mod=1000; 8 int f[N],fa[N]; 9 char s[3];10 int n;11 12 int mabs(int x) {
return x>0?x:-x;}13 int ffind(int x)14 {15 if (fa[x]!=x)16 {17 int fx=fa[x];18 fa[x]=ffind(fx);//更新了fx19 f[x]+=f[fx];//注意:题意不是全部都取模,只是新连接的长度取模20 }21 return fa[x];22 }23 int main()24 {25 int T,x,y;26 scanf("%d",&T);27 while (T--)28 {29 scanf("%d",&n);30 for (int i=1;i<=n;i++) fa[i]=i,f[i]=0;31 while (1)32 {33 scanf("%s",s);34 if (s[0]=='O') break;35 if (s[0]=='E')36 {37 scanf("%d",&x);38 ffind(x);//更新39 printf("%d\n",f[x]);40 }41 else42 {43 scanf("%d%d",&x,&y);44 fa[x]=y;//直接相连45 f[x]=mabs(x-y)%mod;46 }47 }48 }49 return 0;50 }

 

转载于:https://www.cnblogs.com/konjak/p/6029281.html

你可能感兴趣的文章
汇正进销存
查看>>
近期学习oracle 数据库总结
查看>>
php apc
查看>>
我的友情链接
查看>>
C#学习视频分享与开发技术QQ交流群
查看>>
bootstrap datetimepicker 时间控件的使用
查看>>
一天一个命令--ifconfig
查看>>
更改Windows Server Core 2008计算机名字和配置网络连接
查看>>
IMI装系统装到一半出错?
查看>>
关于分页
查看>>
队列学习笔记 顺序队列
查看>>
浅谈Java的输入输出流
查看>>
CST 公共生成树
查看>>
windows Server 2003 IIS启用父路径
查看>>
shell脚本的执行方式及区别
查看>>
nginx实现对chunk请求支持
查看>>
我的友情链接
查看>>
中国铁建内网漫游沦陷多个重要部门泄漏大量信息(redis+ssh-keygen免认证登录案例)...
查看>>
Mongodb 添加删除分片与非分片表维护
查看>>
CentOS6.4之文本编辑器Vi/Vim
查看>>