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

时间:2021-04-05 10:48:04

  题目传送门

星球大战

题目描述

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

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

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

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

输入输出格式

输入格式:

输入文件第一行包含两个整数, 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: 复制
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
1
2
3
3

说明

[JSOI2008]


  分析:

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

  Code:

#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<iostream>
#include<iomanip>
#include<algorithm>
using namespace std;
const int N=4e5+;
int head[N],size=;
int h[N],fa[N],ans[N];
bool e[N];
struct Node
{
int from,to,next;
}edge[N];
inline void add(int x,int y)
{
edge[size].from=x;
edge[size].to=y;
edge[size].next=head[x];
head[x]=size;
size++;
}
inline int find(int x)
{
if(x!=fa[x])fa[x]=find(fa[x]);
return fa[x];
}
int main()
{
int n,m,k,x,y,tot,i,u;
cin>>n>>m;
for(i=;i<n;i++)
{
fa[i]=i;
head[i]=-;
}
for(i=;i<m;i++)
{
cin>>x>>y;
add(x,y);add(y,x);
}
cin>>k;
tot=n-k;
for(i=;i<=k;i++)
{
cin>>x;
e[x]=true;
h[i]=x;
}
for(i=;i<*m;i++)
{
x=edge[i].from,y=edge[i].to;
if(e[x]==false&&e[y]==false)
{
if(find(x)!=find(y))
{
tot--;
fa[find(x)]=fa[find(y)];
}
}
}
ans[k+]=tot;
for(int t=k;t>=;t--)
{
u=h[t];
e[u]=false;
tot++;
for(i=head[u];i!=-;i=edge[i].next)
{
if(e[edge[i].to]==false&&find(u)!=find(edge[i].to))
{
tot--;
fa[find(edge[i].to)]=fa[find(u)];
}
}
ans[t]=tot;
}
for(i=;i<=k+;i++)
cout<<ans[i]<<endl;
return ;
}

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

  1. 洛谷 P1197 &lbrack;JSOI2008&rsqb;星球大战——并查集

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

  2. Bzoj1015&sol;洛谷P1197 &lbrack;JSOI2008&rsqb;星球大战(并查集)

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

  3. P1197 &lbrack;JSOI2008&rsqb;星球大战&lbrack;并查集&plus;图论&rsqb;

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

  4. 洛谷P1197 &lbrack;JSOI2008&rsqb;星球大战

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

  5. P1197 &lbrack;JSOI2008&rsqb;星球大战 并查集 反向

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

  6. 洛谷 P1197 &lbrack;JSOI2008&rsqb;星球大战

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

  7. BZOJ1015或洛谷1197 &lbrack;JSOI2008&rsqb;星球大战

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

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

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

  9. JSOI2008 星球大战 &lbrack;并查集&rsqb;

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

随机推荐

  1. css单行文本与多行溢出文本的省略号问题

    在文字布局和代码编写过程中遇到文本溢出是常有的事,下面总结一下对于单行文本溢出和多行文本溢出省略号的处理. 一.单行文本省略号 <p class="text1"> 这是 ...

  2. java中equals和hashCode方法的解析

    解析Java对象的equals()和hashCode()的使用 前言 在Java语言中,equals()和hashCode()两个函数的使用是紧密配合的,你要是自己设计其中一个,就要设计另外一个.在多 ...

  3. 管理后台-第一部分:Creating custom sections in Umbraco 7 - Part 1(翻译文档)

    在Umbraco上每个部分都可以被称为一个应用程序,所以这些部分和应用程序基本上是一样的.我们首先要做的事情是需要创建应用程序.在这个例子中,我不会去摆弄xml文件或是数据库——我将使用类来创建我的内 ...

  4. String是java中的基本数据类型吗

    1. 首先String不属于8种基本数据类型,String是一个对象. 因为对象的默认值是null,所以String的默认值也是null:但它又是一种特殊的对象,有其它对象没有的一些特性. 2. Ja ...

  5. Redis分布式集群搭建

    Redis集群架构图 上图蓝色为redis集群的节点. 节点之间通过ping命令来测试连接是否正常,节点之间没有主区分,连接到任何一个节点进行操作时,都可能会转发到其他节点. 1.Redis的容错机制 ...

  6. js中的数组方法

    数组的方法有数组原型方法,也有从object对象继承来的方法,这里我们只介绍数组的原型方法,数组原型方法主要有以下这些: join()push()和pop()shift() 和 unshift()so ...

  7. Javaweb学习笔记——(二十)——————Javaweb监听器、国际化

    Javaweb监听器     三大组件         *Servlet         *Listener         *Filter Listener:监听器         1.初次相见:A ...

  8. css的再深入6(更新中&&num;183&semi;&&num;183&semi;&&num;183&semi;)

    background-position  雪碧图 我们的html和css中有三个属性可以向服务器发送请求,src href url. overflow (1) 值hidden 超出就隐藏 (2) 值s ...

  9. Python 函数装饰器

    首次接触到装饰器的概念,太菜啦! Python 装饰器可以大大节省代码的编写量,提升代码的重复使用率.函数装饰器其本质也是一个函数,我们可以把它理解为函数中定义了一个子函数. 例如我们有这么一个需求, ...

  10. kettle学习笔记(十)——数据检验、统计、分区与JS脚本

    一.概述 数据剖析和数据检验: 用于数据的检查.清洗 . 统计步骤: 提供数据采样和统计的功能 分区: 根据数据里某个字段的值,拆分成多个数据块.输出到不同的库表和文件中. 脚本: Javascrip ...