UVALive 3027 并查集
2015-10-29 20:33
435 查看
#include <cstdio> #include <queue> #include <cstring> #include <iostream> #include <cstdlib> #include <algorithm> #include <vector> #include <map> #include <set> #include <ctime> using namespace std; struct Node { int f,d; }; Node node[20010]; int T,n,u,v; /* void findset(int x,int &d,int &f) { if(node[x].f==x) return; findset(f,node[f].d,node[f].f); d+=node[f].d; f=node[f].f; } */ int findset(int x) { if(node[x].f==x) return x; int tmp=findset(node[x].f);//tmp暂时存下返回值,因为node[x].f要在node[x].d+=node[node[x].f].d后才能改变 node[x].d+=node[node[x].f].d; return node[x].f=tmp; } int main() { //freopen("/home/user/桌面/in","r",stdin); scanf("%d",&T); while(T--) { scanf("%d",&n); char op[2]; for(int i=0;i<=20000;i++) { node[i].d=0; node[i].f=i; } while(scanf("%s",op)==1&&op[0]!='O') { if(op[0]=='I')//I i j { scanf("%d%d",&u,&v); node[u].f=v; node[u].d+=abs(u-v)%1000; //printf("%d %d\n",node[u].f,node[u].d); } else { scanf("%d",&u); findset(u); printf("%d\n",node[u].d); //for(int i=1;i<=4;i++) //printf("f=%d d=%d\n",node[i].f,node[i].d); } } } //printf("time=%.3lf",(double)clock()/CLOCKS_PER_SEC); return 0; }
View Code
相关文章推荐
- Matlab远程链接桌面无法使用
- 角色更新
- 头疼!中国人最想买和最后买的手机为何不一样
- Java Web应用下实现定时任务的简便方法
- IOS学习之 WebView的用法
- java基础--可变参数
- JAVA数组课后作业
- ScrollView中嵌套ListView问题
- 语言文法
- struts2中result的type跳转类型总结
- spring框架简介
- Java随笔-Set集合(上)
- hdoj--2534--Score(gcd)
- Switch语句的循环嵌套
- POJ 1141 Brackets Sequence(区间DP记录路径)
- 《计算机网络-自顶向下方法》读书笔记-传输层篇
- ubuntu15.10挂载远程服务器到本地
- ANSI C定义了零指针常量的概念
- hdoj--2534--Score(gcd)
- 心累,最初的梦想还能走多远?