BZOJ 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)

时间:2022-03-14 02:04:22

[JSOI2008]星球大战starwar
                                                时间限制: 3 Sec 内存限制: 162 MB
【题目描述】

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

【输入】
  输入文件第一行包含两个整数,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的范
围内。
【输出】
  输出文件的第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球
的连通块个数。
【样例输入】
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
【样例输出】
1
1
1
2
3
3

分析:

如果按正常方法,先将图建好,然后依次删点,并求联通块数量肯定超时,但如果我们倒过来处理,先将所有要破坏的点全破坏,然后倒着将删除的点依次加回去,在这个过程中求联通块数量,会发现用并查集处理非常简单:当加入i节点时,找到所有与之相连的且未破坏的点,一个接一个合并,每合并一个联通块数目就减1,如果这个点与i已经在同一个联通块中,就不用减1。最后结果要加一,因为整个为一个连通块。

注意要考虑到加入的点单独构成连通块的情况。

同时不要忘了,每加入一个点,要把它在布尔数组中变为未破坏的点。

代码:

program starwar;
type
point=^node;
node=record
x:longint; next:point;
end;
var
c:array[..]of point;
a,b,w,f,q:array[..]of longint;
g,r:array[..]of boolean;
n,i,m,k,x,y,t,s:longint; p:point;
procedure add(x,y:longint);
var p:point;
begin
new(p); p^.x:=y; p^.next:=c[x]; c[x]:=p;
end;
function find(x:longint):longint;
var i,j,k:longint;
begin
i:=x; j:=x;
while i<>f[i] do i:=f[i];
while i<>j do begin k:=f[j]; f[j]:=i; j:=k; end;
exit(i);
end;
procedure work;
var i:longint;
begin
fillchar(g,sizeof(g),true);
fillchar(r,sizeof(r),false);
for i:= to n- do f[i]:=i;
s:=;
end;
begin
readln(n,m); work;
for i:= to m do
begin readln(a[i],b[i]); add(a[i],b[i]);add(b[i],a[i]); end;
readln(k);
for i:= to k do
begin readln(w[i]); g[w[i]]:=false; end; for i:= to m do
if (g[a[i]]=true)and(g[b[i]]=true) then
begin
x:=find(a[i]); y:=find(b[i]);
f[y]:=x;
end; for i:= to n- do
if g[i]=true then
begin x:=find(f[i]); if r[x]=false then begin inc(s); r[x]:=true; end; end;
for i:=k downto do
begin
q[i]:=s;
new(p); p:=c[w[i]]; t:=; g[w[i]]:=true;
while p<>nil do
begin
x:=p^.x;
if g[x]=true then
begin
y:=find(x); if y<>w[i] then begin inc(t); f[y]:=w[i]; end;
end;
p:=p^.next;
end;
dec(s,t-);
end;
q[]:=s;
for i:= to k do writeln(q[i]);
end.

BZOJ 1015:[JSOI2008]星球大战starwar(逆向处理+并查集)的更多相关文章

  1. BZOJ 1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar 并查集

    1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...

  2. BZOJ 1015 &lbrack;JSOI2008&rsqb;星球大战starwar

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

  3. bzoj 1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar &lpar;逆向思维&plus;并查集&rpar;

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

  4. BZOJ 1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar(并查集求连通块&plus;离线处理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...

  5. BZOJ 1015 JSOI2008 星球大战 starwar 并检查集合

    标题效果:给定一个无向图.联通谋求块的数目,以及k一个点的破坏后每次:联通,块的数目 侧面和摧毁的地步全记录,我们可以做相反的. 需要注意的是该点不能算作破坏联通块 #include<cstdi ...

  6. BZOJ 1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar【并查集】

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

  7. 【BZOJ】1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar

    1015: [JSOI2008]星球大战starwar 题意:一个点数为N(1<= 40w),边数为M(1<=20w)的图,总共删除k个节点,问开始以及每次删除一个节点之后图的连通块数? ...

  8. 1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Description 很久以前,在一个遥远的星系,一个黑暗的帝国 ...

  9. &lbrack;1015&rsqb;&lbrack;JSOI2008&rsqb;星球大战starwar(并查集)

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

  10. bzoj1015:1015&colon; &lbrack;JSOI2008&rsqb;星球大战starwar

    应该是全部读入之后再添加边用并查集就可以了. yyl用空间换时间.u[]v[]等将边预存起来. #include<cstdio> #include<cstring> #incl ...

随机推荐

  1. xmpp笔记2(客户端到服务器的例子)--xml

    xmpp( 客户端到服务器的例子 ) 1 步:客户端初始流给服务器: <stream:stream xmlns='jabber:client' xmlns:stream='http://ethe ...

  2. 如何正大光明的使用 google 进行搜索

    对于程序猿来说,不能使用google,是一大痛所在,今天在使用 百度网盘 搜索时,突然发现 ,他能同时使用 baidu和 google进行搜索,于是想到了这个正大光明的使用google 的方法,不需要 ...

  3. Linq to OBJECT延时标准查询操作符

    1.Where 操作符用于限定输入集合中的元素,将符合条件的元素组织声称一个序列结果.2.Select  操作符用于根据输入序列中的元素创建相应的输出序列中的元素,输出序列中的元素类型可以与输入序列中 ...

  4. Jquer学习之jQuery&lpar;function&lpar;&rpar;&lbrace;&rcub;&rpar;与&lpar;function&lpar;&rpar;&lbrace;&rcub;&rpar;&lpar;jQuery&rpar;之间的区别

    Jquery是优秀的Javascrīpt框架.我们现在来讨论下在 Jquery 中两个页面载入后执行的函数. $(document).ready(function(){ // 在这里写你的代码... ...

  5. rsync源目录写法的一点小细节

    原始状态: [root@localhost tmp]# tree . ├── a │ ├── a1 │ └── a2 └── b directories, files [root@localhost ...

  6. Elastic Stack-Elasticsearch使用介绍&lpar;五&rpar;

    一.前言     前4篇将Elasticsearch用法的API和原理方面东西介绍了一下,相信大家对Elasticsearch有了一定的认知,接下我们主要从索引的建立到后期的一些优化做一些介绍: 二. ...

  7. JAVA获取汉字拼音首字母

    package com.common.util; import java.io.UnsupportedEncodingException; /** * 取得给定汉字串的首字母串,即声母串 * Titl ...

  8. 设计模式学习心得&lt&semi;组合模式 Composite&gt&semi;

    组合模式(Composite Pattern),又叫部分整体模式,是用于把一组相似的对象当作一个单一的对象.组合模式依据树形结构来组合对象,用来表示部分以及整体层次.这种类型的设计模式属于结构型模式, ...

  9. Android Studio快捷键Ctrl&plus;Shift&plus;F不能用,全局搜索不能用;

    AS全局搜索Ctrl+Shift+F突然就不能用了,在AS找半天没有找到问题,原因竟然是和搜狗输入法的简繁切换冲突了:下面有图把简繁切换关闭或更换快捷键后,as的全局搜索就能用了:

  10. mybatis-plus排除非表中字段

    使用 transient 修饰 private transient String noColumn; 使用 static 修饰 private static String noColumn; 使用 T ...