UVA 1329——Corporative Network
2016-03-21 16:44
253 查看
题意:有n个节点,然后执行I u,v(把u的父节点设为v)和E u(询问u到根节点的距离)。
思路:并查集。加了信息的并查集,在路径压缩的同时维护距离d[i];
code:
#include <bits/stdc++.h>
using namespace std;
const int N=2e4+5;
int fa
,d
;
int getfa(int x)
{
if (x!=fa[x]){
int rt=getfa(fa[x]);
d[x]+=d[fa[x]];
fa[x]=rt;
}
return fa[x];
}
int main()
{
int T;
scanf("%d",&T);
while (T--){
int n,u,v;
char cmd[9];
scanf("%d",&n);
for (int i=0;i<n;i++) fa[i]=i,d[i]=0;
while (scanf("%s",cmd)&&cmd[0]!='O'){
if (cmd[0]=='E') {scanf("%d",&u);getfa(u);printf("%d\n",d[u]);}
else {scanf("%d %d",&u,&v);fa[u]=v;d[u]=abs(u-v)%1000;}
}
}
}
思路:并查集。加了信息的并查集,在路径压缩的同时维护距离d[i];
code:
#include <bits/stdc++.h>
using namespace std;
const int N=2e4+5;
int fa
,d
;
int getfa(int x)
{
if (x!=fa[x]){
int rt=getfa(fa[x]);
d[x]+=d[fa[x]];
fa[x]=rt;
}
return fa[x];
}
int main()
{
int T;
scanf("%d",&T);
while (T--){
int n,u,v;
char cmd[9];
scanf("%d",&n);
for (int i=0;i<n;i++) fa[i]=i,d[i]=0;
while (scanf("%s",cmd)&&cmd[0]!='O'){
if (cmd[0]=='E') {scanf("%d",&u);getfa(u);printf("%d\n",d[u]);}
else {scanf("%d %d",&u,&v);fa[u]=v;d[u]=abs(u-v)%1000;}
}
}
}
相关文章推荐
- JavaScript设计模式 Item9 --适配器模式Adapter111
- PKCS标准
- DLL入门浅析(5)——使用DLL在进程间共享数据
- DLL入门浅析(4)——从DLL中导出类
- CSS3 选择器 属性选择器介绍
- 由于后面的视频没有将单独的笔记发布,所以自己记录
- 解决android studiogradle 错误 找不到程序包 符号
- 别人的面试
- 自学鸟哥linux服务-邮箱服务postfix+dovecot
- ios数据库升级,自动添加字段
- iOS开发调试技巧总结
- BoxFilter包滤波器
- Problem L
- Problem L
- 安卓入门学习(一)Hello,world!
- 重新指派usb转串口模块在linux系统中的设备调用名称
- Java单元测试Junit(五)使用Spring TestContext测试Spring应用
- 工业镜头笔记
- Java中的包装类
- Python 数据结构与算法——从二分图到寻找最大排列(Maximum Permutation)