题目传送门

星球大战

题目描述

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。

某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。

但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。

现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。

输入输出格式

输入格式:

输入文件第一行包含两个整数, N (1<=N<=2M ) 和M (1<=M<=200,000 ),分别表示星球的数目和以太隧道的数目。星球用 0 ~ N−1 的整数编号。

接下来的 M 行,每行包括两个整数 X ,Y ,其中(0<=X<>Y 表示星球 x 和星球 y 之间有 “以太” 隧道,可以直接通讯。

接下来的一行为一个整数 k ,表示将遭受攻击的星球的数目。

接下来的 k 行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这 k 个数互不相同,且都在 0 到 n−1 的范围内。

输出格式:

第一行是开始时星球的连通块个数。接下来的 K 行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

输入输出样例

输入样例#1: 复制

  1. 8 13
  2. 0 1
  3. 1 6
  4. 6 5
  5. 5 0
  6. 0 6
  7. 1 2
  8. 2 3
  9. 3 4
  10. 4 5
  11. 7 1
  12. 7 2
  13. 7 6
  14. 3 6
  15. 5
  16. 1
  17. 6
  18. 3
  19. 5
  20. 7
输出样例#1: 复制

  1. 1
  2. 1
  3. 1
  4. 2
  5. 3
  6. 3

说明

[JSOI2008]


  分析:

  求联通块很容易想到是并查集,但是并查集并不支持删除的操作,那么就要倒序进行。先建立一幅图,所有的星球就是点,中间的隧道就是边。设置一个vis[],表示该星球是否会遭到打击,将所有不会遭到打击的星球形成的联通块个数求出,就是最后一次打击后的联通块个数,然后倒序将每个被打击的星球的标记去除,然后将星球放回图中求联通块个数。具体看代码吧(这道题还是我代码风格还很正常的时候写的23333)

  Code:

  1. #include<cstdio>
  2. #include<cstring>
  3. #include<cstdlib>
  4. #include<cmath>
  5. #include<iostream>
  6. #include<iomanip>
  7. #include<algorithm>
  8. using namespace std;
  9. const int N=4e5+;
  10. int head[N],size=;
  11. int h[N],fa[N],ans[N];
  12. bool e[N];
  13. struct Node
  14. {
  15. int from,to,next;
  16. }edge[N];
  17. inline void add(int x,int y)
  18. {
  19. edge[size].from=x;
  20. edge[size].to=y;
  21. edge[size].next=head[x];
  22. head[x]=size;
  23. size++;
  24. }
  25. inline int find(int x)
  26. {
  27. if(x!=fa[x])fa[x]=find(fa[x]);
  28. return fa[x];
  29. }
  30. int main()
  31. {
  32. int n,m,k,x,y,tot,i,u;
  33. cin>>n>>m;
  34. for(i=;i<n;i++)
  35. {
  36. fa[i]=i;
  37. head[i]=-;
  38. }
  39. for(i=;i<m;i++)
  40. {
  41. cin>>x>>y;
  42. add(x,y);add(y,x);
  43. }
  44. cin>>k;
  45. tot=n-k;
  46. for(i=;i<=k;i++)
  47. {
  48. cin>>x;
  49. e[x]=true;
  50. h[i]=x;
  51. }
  52. for(i=;i<*m;i++)
  53. {
  54. x=edge[i].from,y=edge[i].to;
  55. if(e[x]==false&&e[y]==false)
  56. {
  57. if(find(x)!=find(y))
  58. {
  59. tot--;
  60. fa[find(x)]=fa[find(y)];
  61. }
  62. }
  63. }
  64. ans[k+]=tot;
  65. for(int t=k;t>=;t--)
  66. {
  67. u=h[t];
  68. e[u]=false;
  69. tot++;
  70. for(i=head[u];i!=-;i=edge[i].next)
  71. {
  72. if(e[edge[i].to]==false&&find(u)!=find(edge[i].to))
  73. {
  74. tot--;
  75. fa[find(edge[i].to)]=fa[find(u)];
  76. }
  77. }
  78. ans[t]=tot;
  79. }
  80. for(i=;i<=k+;i++)
  81. cout<<ans[i]<<endl;
  82. return ;
  83. }

洛谷P1197 [JSOI2008] 星球大战 [并查集]的更多相关文章

  1. 洛谷 P1197 [JSOI2008]星球大战——并查集

    先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ...

  2. Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)

    题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...

  3. P1197 [JSOI2008]星球大战[并查集+图论]

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

  4. 洛谷P1197 [JSOI2008]星球大战

    题目 由于题目不要求强制在线,所以可以离线. 而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通. 然后再从后往前枚举,得出答案 #include <bit ...

  5. P1197 [JSOI2008]星球大战 并查集 反向

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

  6. 洛谷 P1197 [JSOI2008]星球大战

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

  7. BZOJ1015或洛谷1197 [JSOI2008]星球大战

    BZOJ原题链接 洛谷原题链接 发现正着想毫无思路,所以我们可以考虑倒着思考,把摧毁变成建造. 这样很容易想到用并查集来维护连通块,问题也变的很简单了. 建原图,先遍历一遍所有边,若某条边的两端点未被 ...

  8. bzoj3673 & bzoj3674 & 洛谷P3402 可持久化并查集

    题目:bzoj3673:https://www.lydsy.com/JudgeOnline/problem.php?id=3673 bzoj3674:https://www.lydsy.com/Jud ...

  9. JSOI2008 星球大战 [并查集]

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

随机推荐

  1. vijos 1655 萌萌的糖果博弈 博弈

    背景 用糖果来引诱小朋友学习是最常用的手法,绵羊爸爸就是用糖果来引诱萌萌学习博弈的. 描述 他把糖果分成了两堆,一堆有A粒,另一堆有B粒.他让萌萌和他一起按照下面的规则取糖果:每次可以任意拿走其中一堆 ...

  2. c# Stream to File的知识点

    个人倾向使用File.WriteAllByte写入文件: //Stream to File MemoryStream ms=...Stream; ms.Position = ; byte[] buff ...

  3. Linux 使用代理使网速变快

    $ export http_proxy="http://USER:PASSWORD@PROXY_SERVER:PORT" $ export https_proxy="ht ...

  4. [uva11806]容斥定理

    n*m的矩形 k个人 第一行,最后一行,第一列,最后一列都至少站有一个人 小水题 正着做不好做,要反着想,那就容斥定理,ABCD四种情况分别是那四个行列分别没有人. #include<cstdi ...

  5. 【BZOJ】1702: [Usaco2007 Mar]Gold Balanced Lineup 平衡的队列

    [题意]给定n头牛,k个特色,给出每头牛拥有哪些特色的二进制对应数字,[i,j]平衡当且仅当第i~j头牛的所有特色数量都相等,求最长区间长度. [算法]平衡树+数学转化 [题解]统计前缀和sum[i] ...

  6. iOS-Apple苹果iPhone开发公开API

      iOS-Apple苹果iPhone开发 //技术博客http://www.cnblogs.com/ChenYilong/   新浪微博http://weibo.com/luohanchenyilo ...

  7. max_element和min_element的用法

    首先,max_element和min_elemetn看字面意思是求最大值和最小值,这个确实是这个意思.不过,需要注意的是,他返回的是最大值(最小值)的地址,而非最大值(最小值).对于一般数组的用法则是 ...

  8. px,em,rem字体单位

    1.px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.(引自CSS2.0手册) 2.em是相对长度单位.相对于当前对象内文本的字体尺寸,em存在值继承问题. 浏览器的默认字 ...

  9. url编码模块

    use LWP::SImple; use URI::Escape; encoded_string = uri_escape(raw_string); get(encoded_string);

  10. Vue-$emit的用法

    1.父组件可以使用 props 把数据传给子组件.2.子组件可以使用 $emit 触发父组件的自定义事件. vm.$emit( event, arg ) //触发当前实例上的事件 vm.$on( ev ...