题面

Description

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

Input

第一行包含两个整数N (2 ≤ N ≤ 2M)和M (1 ≤ M ≤ 200,000),分别表示星球的数目和“以太”隧道的数目。星球用0到N – 1的整数编号。

接下来的M行,每行包含两个整数X和Y (0 ≤ X ≠ Y < N),表示星球X和星球Y之间有“以太”隧道,可以直接通讯。

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

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

Output

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

Sample Input

8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7

Sample Output

1
1
1
2
3
3

题解

考虑正向来做的话,很显然,无法维护联通快,只能够每一次重新来做一遍并查集(因为你要拆边)
但是,反着来看这道题,每次恢复一个点,这样就可以并查集来搞了。

#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 1000000
inline int read()
{register int x=0,t=1;register char ch=getchar();while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();if(ch=='-'){t=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}return x*t;
}
struct Line
{int v,next;
}e[MAX];
int h[MAX],cnt=1,A[MAX];
int f[MAX],tt[MAX];
bool killed[MAX];
int N,M,KK,Ans;
inline void Add(int u,int v)
{e[cnt]=(Line){v,h[u]};h[u]=cnt++;
}
int getf(int x)
{return x==f[x]?x:f[x]=getf(f[x]);
}
int main()
{N=read();M=read();for(int i=1;i<=M;++i){int u=read()+1,v=read()+1;Add(u,v);Add(v,u);}KK=read();for(int i=1;i<=KK;++i){tt[i]=read()+1;killed[tt[i]]=true;}for(int i=1;i<=N;++i)f[i]=i;for(int i=1;i<=N;++i){if(!killed[i]){for(int j=h[i];j;j=e[j].next){if(!killed[e[j].v])f[getf(i)]=getf(e[j].v);}}}for(int i=1;i<=N;++i)if(f[i]==i&&!killed[i])++Ans;A[KK+1]=Ans;for(int i=KK;i;--i){killed[tt[i]]=false;Ans++;for(int j=h[tt[i]];j;j=e[j].next){if(killed[e[j].v])continue;int x=getf(e[j].v),y=getf(tt[i]);if(x==y)continue;else{f[x]=y;--Ans;}}A[i]=Ans;}for(int i=1;i<=KK+1;++i)printf("%d\n",A[i]);return 0;
}

转载于:https://www.cnblogs.com/cjyyb/p/7410928.html

【JSOI2008】星球大战 (并查集)相关推荐

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

    这一阵子因为好多原因,学习时间有点少,还好时间不算很长. 这两天写了道并查集的题目,感觉不错. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶 ...

  2. bzoj1015 [JSOI2008]星球大战 并查集

    对于这种连续删边的问题,可以离线,这样就变成了加边,usaco有类似的题.. 码: #include<iostream> #include<cstdio> #include&l ...

  3. 【BZOJ1015】【JSOI2008】星球大战 并查集

    题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...

  4. P1197 [JSOI2008]星球大战 题解

    题目:P1197 [JSOI2008]星球大战 并查集 - 图论 - 连通块 题目大意 给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号 敌人依次攻击这 ...

  5. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

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

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

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

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

  8. BZOJ1015 JSOI2008 星球大战starwars 并查集

    题意:给定一张无向图,不断从图上删点,询问每次删点后联通块的数量 题解:离线,在删完点后的图上不断加点,用并查集维护联通性. #include <cstdio> #include < ...

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

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

最新文章

  1. 谷歌android go 销量,谷歌Android Go进入尴尬期:目前仅十多个App专门适配
  2. php如何看phpinfo(),如何从phpinfo中获取有效信息 | 学步园
  3. pythonsuper继承规则,深入理解Python中的super()方法
  4. 实验3.3 设计一个用于人事管理的People(人员)类
  5. mysql数据传出_从MySQL读取数据,以List方式传出
  6. 2019牛客暑期多校训练营(第二场)A(随机化)
  7. Oracle使用systimestamp取微秒
  8. 澳洲计算机专业几年,2020年澳洲八大计算机硕士专业学费是多少?入学要求高吗?读几年?...
  9. 使用docker搭建steam 饥荒服务器
  10. jacob+wps 文档转为pdf excel转换pdf卡死无响应
  11. 【虫师--系列15】性能测试知多少---系统架构分析
  12. 单片机Fault故障常见应对办法
  13. Epubor Ultimate for mac(mac电子书转换软件)
  14. 小程序轮播图:点击放大长按保存。
  15. mac中idea使用createNewFile创建文件
  16. 解决SQL Server报错:229、262、5123
  17. proguard的使用
  18. 谭八爷系统模式的探讨
  19. [经验分享]TL431的应用及其封装乱象
  20. 9.3.5 幻方 (20分)

热门文章

  1. 【嵌入式】嵌入式天地博客汇总
  2. 【Linux】一步一步学Linux——ipcs命令(141)
  3. 【Linux】一步一步学Linux——newgrp命令(91)
  4. 如何将usb连接到远程计算机,远程服务器怎么共享usb
  5. oracle 补丁打不上_oracle 打补丁常见问题
  6. mysql 12142_php连接mysql的类mysql.class.php
  7. Sublime Text 2快捷键大全
  8. matlab中的scramble函数,matlab 中 hold on 和hold off的使用
  9. Objective-C MacOS以管理员权限运行程序
  10. 认识控制台-控制台句柄、附着到控制台、关闭控制台