题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemCode=3261

题意:有很多颗星球,各自有武力值,星球间有一些联系通道,现在发生战争,有一些联系通道会被摧毁,而一些星球会通过还没有被摧毁的联系通道直接或者间接联系能够联系到的武力值最高的星球求救,如果有多个武力值都为最高的,那就联系一个编号最小的。现在给出一系列求救和摧毁的序列,一次执行,并对于每一个求救指令寻找合适的求救星球编号,如果没有可以求救的则输出 -1

这是一道启发题,有时候正这困难倒着反倒简单。

怎么说,链接好然后断开链接并不是简简单单就能实现的要么复杂度巨高要么就是不存在的。

所以还不如直接要断开的直接都不连,倒着来遇到要断开的位置再连上,这样就是简单的并查集了

  1. #include <iostream>
  2. #include <cstring>
  3. #include <cstdio>
  4. #include <map>
  5. using namespace std;
  6. const int M = 5e4 + 10;
  7. int n , m , q , val[M] , f[M] , pos[M] , num[M] , ans[M];
  8. struct TnT {
  9. int x , y , z;
  10. }T[M] , node[M];
  11. bool vis[M];
  12. map<int , int>mmp[M];
  13. int find(int x) {
  14. if(x == f[x])
  15. return x;
  16. return f[x] = find(f[x]);
  17. }
  18. void Union(int x , int y) {
  19. int a = find(x) , b = find(y);
  20. if(a != b) {
  21. f[a] = b;
  22. if(num[b] < num[a]) {
  23. num[b] = num[a];
  24. pos[b] = pos[a];
  25. }
  26. else if(num[b] == num[a]) {
  27. if(pos[a] < pos[b]) {
  28. pos[b] = pos[a];
  29. }
  30. }
  31. }
  32. }
  33. int main() {
  34. int u , v;
  35. bool first = true;
  36. char cp[20];
  37. while(scanf("%d" , &n) != EOF) {
  38. if(first)
  39. first = false;
  40. else
  41. printf("\n");
  42. for(int i = 0 ; i < n ; i++) {
  43. scanf("%d" , &val[i]);
  44. f[i] = i , pos[i] = i , num[i] = val[i];
  45. mmp[i].clear();
  46. }
  47. scanf("%d" , &m);
  48. for(int i = 1 ; i <= m ; i++) {
  49. scanf("%d%d" , &u , &v);
  50. if(u > v) {
  51. int tmp = u;
  52. u = v;
  53. v = tmp;
  54. }
  55. T[i].x = u;
  56. T[i].y = v;
  57. mmp[u][v] = i;
  58. vis[i] = false;
  59. }
  60. scanf("%d" , &q);
  61. for(int i = 1 ; i <= q ; i++) {
  62. scanf("%s" , cp);
  63. if(cp[0] == 'q') {
  64. scanf("%d" , &node[i].x);
  65. node[i].z = 1;
  66. }
  67. else {
  68. scanf("%d%d" , &u , &v);
  69. node[i].z = 2;
  70. if(u > v) {
  71. int tmp = u;
  72. u = v;
  73. v = tmp;
  74. }
  75. node[i].x = u , node[i].y = v;
  76. vis[mmp[u][v]] = true;
  77. }
  78. }
  79. for(int i = 1 ; i <= m ; i++) {
  80. if(!vis[i]) {
  81. Union(T[i].x , T[i].y);
  82. }
  83. }
  84. int cnt = 0;
  85. for(int i = q ; i >= 1 ; i--) {
  86. if(node[i].z == 1) {
  87. int g = node[i].x;
  88. int end = find(g);
  89. if(num[end] > val[g])
  90. ans[cnt++] = pos[end];
  91. else
  92. ans[cnt++] = -1;
  93. }
  94. else {
  95. Union(node[i].x , node[i].y);
  96. }
  97. }
  98. for(int i = cnt - 1 ; i >= 0 ; i--) {
  99. printf("%d\n" , ans[i]);
  100. }
  101. }
  102. return 0;
  103. }

zoj 3261 Connections in Galaxy War(并查集逆向加边)的更多相关文章

  1. 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)

    这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...

  2. ZOJ 3261 - Connections in Galaxy War ,并查集删边

    In order to strengthen the defense ability, many stars in galaxy allied together and built many bidi ...

  3. 题解报告:zoj 3261 Connections in Galaxy War(离线并查集)

    Description In order to strengthen the defense ability, many stars in galaxy allied together and bui ...

  4. ZOJ 3261 Connections in Galaxy War(逆向并查集)

    参考链接: http://www.cppblog.com/yuan1028/archive/2011/02/13/139990.html http://blog.csdn.net/roney_win/ ...

  5. ZOJ 3261 Connections in Galaxy War (逆向+带权并查集)

    题意:有N个星球,每个星球有自己的武力值.星球之间有M条无向边,连通的两个点可以相互呼叫支援,前提是对方的武力值要大于自己.当武力值最大的伙伴有多个时,选择编号最小的.有Q次操作,destroy为切断 ...

  6. zoj 3261 Connections in Galaxy War

    点击打开链接zoj 3261 思路: 带权并查集 分析: 1 题目说的是有n个星球0~n-1,每个星球都有一个战斗值.n个星球之间有一些联系,并且n个星球之间会有互相伤害 2 根本没有思路的题,看了网 ...

  7. ZOJ-3261 Connections in Galaxy War 并查集 离线操作

    题目链接:https://cn.vjudge.net/problem/ZOJ-3261 题意 有n个星星,之间有m条边 现一边询问与x星连通的最大星的编号,一边拆开一些边 思路 一开始是真不会,甚至想 ...

  8. ZOJ - 3261 Connections in Galaxy War(并查集删边)

    https://cn.vjudge.net/problem/ZOJ-3261 题意 银河系各大星球之间有不同的能量值, 并且他们之间互相有通道连接起来,可以用来传递信息,这样一旦有星球被怪兽攻击,便可 ...

  9. ZOJ3261 Connections in Galaxy War 并查集

    分析:对于这种删边操作,我们通常可以先读进来,然后转化离线进行倒着加边 #include <stdio.h> #include <string.h> #include < ...

随机推荐

  1. win10教育版激活错误:在运行 Microsoft Windows 非核心版本的计算机上,运行"slui.exe ...”

    折腾了一天,最终轻松解决,先启用Software Protection服务,在激活(密钥或者工具都行). PS:但是这样还是无法解决Software Protection自动停止的问题,这个可以参考网 ...

  2. LR有的JMeter也有之一“参数化”

    酝酿了几天,一直想写点JMeter的东西,算是对学习东西的一个整理.:) 恩,一直觉得自己领悟能力不强,别人写的东西总要看老半天也不懂.好吧!一惯的傻瓜的方式(大量的截图+参数说明)嘻嘻. 参数化:简 ...

  3. 2.PHP利用PDO连接方式连接mysql数据库

    代码如下 <?php$serverName = "这里填IP地址";$dbName = "这里填数据库名";$userName = "这里填用户 ...

  4. 【游记】NOIP2019初赛

    声明 我的游记是一个完整的体系,如果没有阅读过往届文章,阅读可能会受到障碍. ~~~上一篇游记的传送门~~~ 前言 (编辑中) 文章推荐:[游记]NOIP2019复赛

  5. alluxio2.0特性-预览

    项目地址 https://github.com/Alluxio/alluxio/tree/branch-2.0-preview 2.0版本-构思和设计 支持超大规模数据工作负载 Alluxio作为计算 ...

  6. js实现图片上传方法

    知识点 onchange事件 循环 封装函数 ajax php Javascript代码 //找到元素 var file=document.getElementById("file" ...

  7. 01-WIN2012R2+SQL2016故障转移群集的搭建

    一.前期准备  1.1.准备4台机器 机器名 IP 功能 jf-yukong 192.168.10.200 做域控服务器 Jf-storage 192.168.10.201 做ISCSI存储服务器 J ...

  8. 实测win10 efi启动及centos7双系统引导顺序修改

    安装win10 安装win10过程中,系统自动建立esp分区,分区格式为FAT16,目录如下 1,EFI/Boot文件夹保持不动 删除 EFI/Microsoft/boot/ 文件夹下面除BCD文件外 ...

  9. Android UI控件常用库汇总

    现在App的开发已经是非常成熟,涌现了一大批开源的工具.这些项目能够提高我们的搬砖效率.以下是一些在开发中比较常使用的控件和库. ListView WaveSwipeRefreshLayout 水滴效 ...

  10. Zabbix-绘制动态拓扑图基础篇

    一.实验环境 1.1 zabbix 4.0.2 二.实验需求介绍 公司希望网络拓扑能够动态反应物理接口的状态或者业务的状态,希望将网络拓扑显示到大屏上 三.Zabbix在绘制拓扑的优缺点 3.1 优点 ...