并查集【p1197】[JSOI2008]星球大战
Description
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系。
某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。
但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。
现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通块的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
Input
输入文件第一行包含两个整数,\(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\) 的范围内。
Output
第一行是开始时星球的连通块个数。接下来的 \(K\) 行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
维护联通块个数? 考虑并查集
但是正序不好做,因此我们考虑倒叙.(正难则反思想)
我们加入这些被破坏的点.
然后再去判断联通块个数,注意新加入一个点的话,如果没有联通,联通块个数要\(++\),如果还能和其他构成联通块,要\(--\)
代码
#include<cstdio>
#include<iostream>
#include<algorithm>
#define N 500008
#define R register
using namespace std;
inline void in(int &x)
{
int f=1;x=0;char s=getchar();
while(!isdigit(s)){if(s=='-')f=-1;s=getchar();}
while(isdigit(s)){x=x*10+s-'0';s=getchar();}
x*=f;
}
int n,m,f[N],k;
int head[N],tot,ques[N],ans[N],cnt;
struct cod{int u,v;}edge[N<<2];
inline void add(R int x,R int y)
{
edge[++tot].u=head[x];
edge[tot].v=y;
head[x]=tot;
}
bool bom[N];
int find(R int x){return f[x]==x?x:f[x]=find(f[x]);}
int main()
{
in(n),in(m);
for(R int i=1,x,y;i<=m;i++)
{
in(x),in(y);
x++,y++;
add(x,y),add(y,x);
}
in(k);
for(R int i=1,x;i<=k;i++)
{
in(x);x++;
bom[x]=true;
ques[i]=x;
}
for(R int i=1;i<=n;i++)f[i]=i;
cnt=n-k;
for(R int x=1;x<=n;x++)
{
if(bom[x])continue;
for(R int i=head[x];i;i=edge[i].u)
{
if(bom[edge[i].v])continue;
R int fu=find(x),fv=find(edge[i].v);
if(fu==fv)continue;
f[fu]=fv;cnt--;
}
}
ans[k+1]=cnt;
for(R int j=k;j>=1;j--)
{
R int x=ques[j];
bom[x]=false;cnt++;
for(R int i=head[x];i;i=edge[i].u)
{
if(bom[edge[i].v])continue;
R int fu=find(x),fv=find(edge[i].v);
if(fu==fv)continue;
f[fu]=fv;cnt--;
}
ans[j]=cnt;
}
for(R int i=1;i<=k+1;i++)
printf("%d\n",ans[i]);
}
并查集【p1197】[JSOI2008]星球大战的更多相关文章
- P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反)
P1197 [JSOI2008]星球大战(并查集判断连通块+正难则反) 并查集本来就是连一对不同父亲的节点就的话连通块就少一个. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统 ...
- html5 canvas程序演示--P1197 [JSOI2008]星球大战
html5 canvas程序演示--P1197 [JSOI2008]星球大战 <!doctype html> <html> <head> <meta char ...
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- P1197 [JSOI2008]星球大战[并查集+图论]
题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ...
- P1197 [JSOI2008]星球大战 并查集 反向
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)
题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...
- 【反向并查集、联通图】P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- P1197 [JSOI2008]星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- Luogu P1197 [JSOI2008]星球大战 By cellur925
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- 洛谷P1197 [JSOI2008]星球大战
题目 由于题目不要求强制在线,所以可以离线. 而离线的话就会带来许多便利,所以我们可以先处理出全部打击后的图,通过并查集来判断是否连通. 然后再从后往前枚举,得出答案 #include <bit ...
随机推荐
- springboot 实现自定义注解
1.定义一个注解@Target(ElementType.METHOD)@Retention(RetentionPolicy.RUNTIME)@Documentedpublic @interface T ...
- 【ZJ选讲·字符串折叠】
给一个字符串(len<=100) 把这个字符串折叠(就是压缩) 记 X(子串) 表示重复 X次该子串 比如 3(orz) orzorzorz 来点神奇例子: AAAAAAAAAA ...
- bzoj 4880 [Lydsy1705月赛]排名的战争 贪心
[Lydsy1705月赛]排名的战争 Time Limit: 8 Sec Memory Limit: 256 MBSubmit: 338 Solved: 69[Submit][Status][Di ...
- There is an overlap in the region chain
ERROR: (regions day_hotstatic,860010-2355010000_20140417_12_entry_00000000321,1398674475358.0dc20573 ...
- mysql__视图
视图 1.什么是视图 视图是一种虚拟存在的表,对于使用视图的用户来说基本上是透明的.视图并不是在数据库中实际存在的,行和列数据来自定义视图的查询中使用的表,并且是在使用视图时动态生成的 视图相对于普通 ...
- 斯特林数(Stirling number)
在组合数学,Stirling 数可指两类数,第一类Stirling 数和第二类 Stirling 数,都是由18世纪数学家 James Stirling 提出的. Stirling 数有两种,第一类和 ...
- 在Idea中使用Eclipse编译器
Eclipse编译器对Javac编译器的优点如下: 1.Proceed on errors 如果使用Javac编译器,你除了在执行之前修复所有错误之外没有其它的选择.然而Eclipse编译器却可以不管 ...
- bzoj 1861 splay
就是裸地splay,然后自己写的不是特别好,tle了,最近时间比较紧迫,有时间了改下,在此记录 另附转载pascal AC代码最下面 /******************************** ...
- [转]树莓派gpio口控制
0.前言 树莓派现在越来越火,网上树莓派的资料也越来越多.树莓派源自英国,国外嵌入式开源领域具有良好的分享精神,树莓派各种集成库也层出不穷,下面推荐几个. [[开发语言]——python [[ ...
- POJ1080(LCS变形)
Human Gene Functions Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Oth ...