题目描述

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

但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。

输入输出格式

输入格式:

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

接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y<N),表示星球X和星球Y之间有以太隧道。注意所有的以太隧道都是双向的。

接下来一行是一个整数K,表示帝国计划打击的星球个数。

接下来的K行每行一个整数X,满足0<=X<N,表示帝国计划打击的星球编号。帝国总是按输入的顺序依次摧毁星球的。

输出格式:

输出文件的第一行是开始时星球的连通块个数。

接下来的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]

关键词:逆向,并查集,离线

  1. //Gang
  2. #include<iostream>
  3. #include<cstring>
  4. #include<algorithm>
  5. #include<cstdio>
  6. #include<cstdlib>
  7. #include<queue>
  8. #include<cmath>
  9. #define FOR(x,y,z) for(int x=y;x<=z;x++)
  10. #define REP(x,y,z) for(int x=y;x>=z;x--)
  11. #define ll long long
  12. using namespace std;
  13. ],hd[];
  14. ],vis[];
  15. int cnt;
  16. int n,m,k;
  17. ];
  18. int ans;
  19. int a,b;
  20. struct node{
  21. int to,next;
  22. }e[];
  23. int find(int x)
  24. {
  25. int p,temp;
  26. p=x;
  27. while(x!=fa[x])
  28. {
  29. x=fa[x];
  30. }
  31. while(p!=x)
  32. {
  33. temp=fa[p];
  34. fa[p]=x;
  35. p=temp;
  36. }
  37. return x;
  38. }
  39. void add(int x,int y)
  40. {
  41. ++cnt;
  42. e[cnt].next=hd[x];
  43. e[cnt].to=y;
  44. hd[x]=cnt;
  45. }
  46. int main()
  47. {
  48. scanf("%d%d",&n,&m);
  49. FOR(i,,n-)fa[i]=i; //从0开始 ,很重要!!!
  50. FOR(i,,m)
  51. {
  52. scanf("%d%d",&a,&b);
  53. add(a,b),add(b,a);//无向图
  54. }
  55. scanf("%d",&k);
  56. FOR(i,,k)
  57. {
  58. scanf("%d",&t[i]);
  59. vis[t[i]]=true;
  60. }
  61. ans=n-k;
  62. FOR(i,,n-) //找出不会被轰炸的点并连起来
  63. {
  64. if(!vis[i])
  65. {
  66. for(int j=hd[i];j;j=e[j].next)
  67. {
  68. if(!vis[e[j].to])
  69. {
  70. int dx=find(i),dy=find(e[j].to);
  71. if(dx!=dy)
  72. fa[dy]=dx,ans--;
  73. }
  74. }
  75. }
  76. }
  77. ]=ans;
  78. REP(i,k,)
  79. {
  80. int c=t[i];
  81. vis[c]=false;
  82. ans++;//因为新加了一个点,所以连通块的个数要加一
  83. for(int j=hd[c];j;j=e[j].next)
  84. {
  85. if(!vis[e[j].to])
  86. {
  87. int dx=find(c),dy=find(e[j].to);
  88. if(dx!=dy)
  89. fa[dy]=dx,ans--;
  90. }
  91. }
  92. out[i]=ans;
  93. }
  94. FOR(i,,k+)printf("%d\n",out[i]);
  95. ;
  96. }

P1197 [JSOI2008]星球大战的更多相关文章

  1. html5 canvas程序演示--P1197 [JSOI2008]星球大战

    html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...

  2. P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)

    P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...

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

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

  4. luogu P1197 [JSOI2008]星球大战

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

  5. Luogu P1197 [JSOI2008]星球大战 By cellur925

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

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

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

  7. P1197 [JSOI2008]星球大战——链式前向星+并查集

    https://www.luogu.org/problem/P1197 这道题算是关闭农场的加强版吧,数据有点大,矩阵存不下: 也是记录删点操作,从后往前加边: 先将每个点都算成一个连通块,然后每连一 ...

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

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

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

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

随机推荐

  1. C#常用单元测试框架比较:XUnit, NUnit, 和 Visual Studio(MSTest)

    做过单元测试的同学大概都知道以上几种测试框架,但我一直很好奇它们到底有什么不同,然后搜到了一篇不错的文章清楚地解释了这几种框架的最大不同之处. 地址在这里:http://www.tuicool.com ...

  2. 队列(存储结构数组)--Java实现

    /*队列:其实也是一种操作受限的线性表 *特点:先进先出 *队尾指针:负责元素的进队 *队头指针:负责元素的出队 *注意:普通队--容易浪费空间,一般队列使用最多的就是循环队列--指针环绕 *队列的实 ...

  3. 02-从零玩转JavaWeb-类与对象

    配套视频:对象与类 一.什么是对象 包含特性和行为的一个实体   下图当中,"颜色"和"体重"属于"特性或叫状态" "咬人&quo ...

  4. 如何清楚微信页面的缓存(静态资源(图片,js,页面))

    就不说啥子原因了,反正就是微信的缓存问题,照着下面的做法做,一定ok了. 不过就是有些麻烦,但是微信的缓存是为了提高自身的性能,我们这些开发要用人家的平台,只有自己去填坑了. 直接贴代码好了,加上去就 ...

  5. Android使用百度地图定位并显示手机位置后使用前置摄像头“偷拍”

    今天老板让我验证一下技术可行性,记录下来. 需求 :定位手机的位置并在百度地图上显示,得到位置后使用前置摄像头进行抓拍 拿到这个需求后,对于摄像头的使用不太熟悉,于是我先做了定位手机并在百度地图上显示 ...

  6. 兼容IE、火狐、谷歌的页面关闭事件

    <html> <head> <script language="javascript"> var blnCheckUnload = true; ...

  7. 收集—— css实现垂直居中

    Method1: 在父元素上设置display:table-cell;vertical-align:middle(父元素不能设置浮动) Method2: 使用flex:父元素设置成display: f ...

  8. 在微信端使用video标签,播放结束会出现QQ浏览器推荐视频的解决办法(vue)

    会出现播放结束显示QQ浏览器推荐视频的原因:(我是vue的项目,而且我是新手,只是单纯的给大家分享一个方法,代码比较low请自动忽略) 因为在x5(QQ浏览器)内核中,把video标签劫持了,只要是检 ...

  9. JavaScript 面试中常见算法问题详解

    1.阐述下 JavaScript 中的变量提升 所谓提升,顾名思义即是 JavaScript 会将所有的声明提升到当前作用域的顶部.这也就意味着我们可以在某个变量声明前就使用该变量,不过虽然 Java ...

  10. JS中有关正则表达式的一些常见应用

    总所周知,正则表达式主要用于字符串处理.表单验证等,简单的代码量实现复杂的功能 1.身份证号码的一个校验 先做一个简单的位数校验来判断身份证的合法性:(15位数字或18位数字或17位数字加X|x) v ...