2015陕西 并查集
来源:互联网 发布:淘宝节点考试助手2017 编辑:程序博客网 时间:2024/04/28 02:48
某国家的网络传输系统可以看作是以首都Town为中心的有向树,一开始只是Town建有基站,所有其他城市的信号全是从Town传输过来的,现在他们开始在其他城市建立基站,城市的编号为1->n;其中城市1为首都,"C x"代表在城市x处建立基站,Q代表询问。
输入:每组数据包含2个正整数n和m(1<= n,m <= 100000),分别表示城市和命令数,接下来n-1行,每行有两个整数u和v,代表一条由u到v的网络传输通道,之后m行命令
输出:对于每个查询输出一个数
样例: 3 4
1 2
2 3
Q 3
C 2
Q 2
Q 3
可以明显看出是一个没优化的并查集,但是不优化必定超时= =。
每一次建就把那个点的父亲设定为他自己,但是这样每一次查询都要查找一次,如果压缩路径又达不到那个效果了
反正当时没做出来,而且现在找不到在哪提交,就大概看了下别人的思路
用数组记录下命令,先把"C x"点的上一级设定为自己,命令反向开始,如果是询问,则查找输出;如果是建基站,则把这个点的上一级改为最开始输入时他的上一级,然后一直下去,把查询结果保存再输出。
while(scanf("%d%d",&n,&m)!= EOF){ for(int 1;i < n;i++) { int u,v; scanf("%d%d",&u,&v); p[v] = u; } for(int i = 2;i <= n;i++) f[i] = p[i]; f[1] = 1; for(int i = 0;i < m;i++) { scanf("%s%d",cmd,&x[i]); opr[i] = cmd[0]; if(opr[i] == 'C') { f[x[i]] = x[i]; } } for(int i = m - 1;i >= 0;i --) { if(opr[i] == 'C') f[x[i]] = p[x[i]]; else ans[i] = find[x[i]]; } for(int i = 0;i < m;i++) { if(opr[i] == 'Q') printf("%d\n",ans[i]); }}
0 0
- 2015陕西 并查集
- HDU3938 并查集 并查集
- 并查集(集并查)
- HDU1232 并查集<并>
- BZOJ 4195 && NOI 2015 并查集
- 并查集
- 数据结构-并查集
- 并查集
- 并查集!
- 并查集
- 并查集
- 并查集
- 并查集
- 并查集总结
- 并查集学习
- 并查集
- 并查集
- 并查集
- 译密码问题
- 《C#高级编程》【第六章】数组 -- 学习笔记
- C++ Primer Plus学习笔记二(第三章)
- 欢迎使用CSDN-markdown编辑器
- 九章算法面试题76 搜索二维矩阵
- 2015陕西 并查集
- NSPredicate学习
- 【PAT】自测1 打印沙漏
- 多线程知识点1
- MAC OS X 10.9.X下用命令行开启SSD trim的方法汇总
- 【记录】Linux的五个查找命令
- 学习七十一雾央MFC游戏心得,初体验(四)
- Unity项目对 git版本控制库扩展插件
- shell学习十三天----sed案例分析