题目链接:

https://www.lydsy.com/JudgeOnline/problem.php?id=1015

题目大意:

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)

思路:

删点之后不好维护,所以离线下来,逆向处理,逐渐加点维护连通块个数即可。

  1. #include<bits/stdc++.h>
  2. #define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
  3. #define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
  4. #define Min(a, b) ((a) < (b) ? (a) : (b))
  5. #define Mem(a) memset(a, 0, sizeof(a))
  6. #define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
  7. #define MID(l, r) ((l) + ((r) - (l)) / 2)
  8. #define lson ((o)<<1)
  9. #define rson ((o)<<1|1)
  10. #pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
  11. using namespace std;
  12. inline int read()
  13. {
  14. int x=,f=;char ch=getchar();
  15. while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
  16. while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
  17. return x*f;
  18. }
  19. typedef long long ll;
  20. const int maxn = + ;
  21. const int mod = ;//const引用更快,宏定义也更快
  22. const int INF = 1e9;
  23. int p[maxn];
  24. vector<int>G[maxn];
  25. bool vis[maxn];
  26. stack<int>ans;
  27. int Find(int x)
  28. {
  29. return x == p[x] ? x : p[x] = Find(p[x]);
  30. }
  31. int a[maxn];
  32. int main()
  33. {
  34. int n, m, u, v;
  35. scanf("%d%d", &n, &m);
  36. while(m--)
  37. {
  38. scanf("%d%d", &u, &v);
  39. G[u].push_back(v);
  40. G[v].push_back(u);
  41. }
  42. for(int i = ; i < n; i++)p[i] = i;
  43. scanf("%d", &m);
  44. for(int i = ; i < m; i++)scanf("%d", &a[i]), vis[a[i]] = ;
  45. for(int u = ; u < n; u++)
  46. {
  47. if(!vis[u])for(int i = ; i < G[u].size(); i++)
  48. {
  49. int v = G[u][i];
  50. if(!vis[v])
  51. {
  52. int x = Find(u), y = Find(v);
  53. p[x] = y;
  54. }
  55. }
  56. }
  57. int tot = ;
  58. for(int i = ; i < n; i++)if(!vis[i])if(p[i] == i)tot++;
  59. ans.push(tot);
  60. for(int i = m - ; i >= ; i--)
  61. {
  62. int u = a[i], cnt = ;
  63. vis[u] = ;
  64. for(int j = ; j < G[u].size(); j++)
  65. {
  66. int v = G[u][j];
  67. if(!vis[v])
  68. {
  69. int x = Find(u), y = Find(v);
  70. if(x != y)
  71. {
  72. cnt++;
  73. p[x] = y;
  74. }
  75. }
  76. }
  77. tot = tot - cnt + ;
  78. ans.push(tot);
  79. }
  80. while(!ans.empty())
  81. {
  82. printf("%d\n", ans.top()), ans.pop();
  83. }
  84. return ;
  85. }

BZOJ 1015 星球大战starwar 逆向并查集的更多相关文章

  1. 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...

  2. bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆 ...

  3. 【BZOJ】1015 [JSOI2008]星球大战starwar(并查集+离线处理)

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过 ...

  4. BZOJ 1015: [JSOI2008]星球大战starwar【并查集】

    题目可以表述成:给定一个无向图G,每次删除它的一个点和与点相关的边集,每次询问该操作后图G的连通度(连通分量的个数).和上一题一样都是考察逆向思维,虽然删除点的做法不会,但是每次加点后询问连通度却是并 ...

  5. [1015][JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2124  Solved: 909[Submit] ...

  6. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3895  Solved: 1750[Submit ...

  7. [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 6849  Solved: 3204[Submit ...

  8. bzoj 1015 星球大战starwar

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题解: 如果按照题目的意思,每次删点.删边太困难了……于是采用逆向思维,构造出最后的 ...

  9. 2018.09.26 bzoj1015: [JSOI2008]星球大战starwar(并查集)

    传送门 并查集经典题目. 传统题都是把删边变成倒着加边,这道题是需要倒着加点. 处理方法是将每个点与其他点的边用一个vector存起来,加点时用并查集统计答案就行了. 代码: #include< ...

随机推荐

  1. Golang聊天室

    一.前期准备 前期准备 需要 import "net"包 IP 类型,其中一个重要的方法是 IP.ParseIP(ipaddr string)来判断是否是合法的 IP 地址 TCP ...

  2. PHP的一些语句 if...else...elseif - Switch - while - for

    条件语句用于基于不同条件执行不同的动作 PHP 条件语句 在您编写代码时,经常会希望为不同的决定执行不同的动作.您可以在代码中使用条件语句来实现这一 点. 在 PHP 中,我们可以使用以下条件语句: ...

  3. Could not find gradle wrapper within android sdk

    问题: IONIC 3.9.2 为ionic项目添加android platform后再build android时,出现如下提示: 问题原因: cordova-android在升级版本之后,从原来基 ...

  4. RabbitMQ---1、安装与部署

    一.下载资源 Rabbit MQ 是建立在强大的Erlang OTP平台上,因此安装Rabbit MQ的前提是安装Erlang.(在官网自行选择版本) 1.otp_win64_20.2.exe 下载地 ...

  5. 八、window搭建spark + IDEA开发环境

    本文将简单搭建一个spark的开发环境,如下: 1)操作系统:window os 2)IDEA开发工具以及scala插件(IDEA和插件版本要对应): 2-1)IDEA2018.2.1:https:/ ...

  6. ROS:消息发布器和订阅器(c++)

    学习资料主要源自http://wiki.ros.org/ROS/Tutorials/WritingPublisherSubscriber%28c%2B%2B%29 $ roscd beginner_t ...

  7. [LeetCode]Find Pivot

    Find Pivot: Given an array of integers nums, write a method that returns the "pivot" index ...

  8. mysql设置不区分大小写

    1.windows下 到安装mysql的目录,修改my.ini文件 在文件最后一行加上下面一句话 lower_case_table_names=1 lower_case_table_names = 1 ...

  9. 浅谈ul布局以及table布局

    我个人对于某些言论说要注重html语义化在布局中的应用,我反而不怎么感冒,试试兼容IE7&&项目期相对较赶的情况下,我还是推荐快速开发为主,兼容性强为主. 如果布局中需要用户边框,推荐 ...

  10. 如何面试Web前端开发

    分享一篇HR前端面试心得: 面试前端工程师对我来说是一件非常有意思的事,因为面试过程很大程度上也是自我提升的过程.无论大公司还是小公司,之所以在如何招聘到真正有能力的,前端工程师方面会遇到同样的问题. ...