【BZOJ】1015: [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar
题意:一个点数为N(1<= 40w),边数为M(1<=20w)的图,总共删除k个节点,问开始以及每次删除一个节点之后图的连通块数?
思路:逆序并查集 即每次往图中加点;主要是因为逆序时,并查集的关系不会改变,最终在同一个连通块中的节点,之前一定还是在一个并查集中;
需注意加点时,如果该点还是孤立节点,这时就需要++sum;当然如果开始就增加连通分块的个数,之后加点的时候减去那也是一样的;
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int N = ;
const int M = ;
int f[N],vis[N],del[N],ans[N];
int tot,head[N],sum;
void init()
{
tot = ;memset(head,,sizeof(head));
}
struct Edge{
int to,Next;
}e[M<<];
inline void ins(int u,int v)
{
e[++tot].Next = head[u]; e[tot].to = v; head[u] = tot;
}
int Find(int a)//**
{
return a == f[a]?f[a]:f[a] = Find(f[a]);
}
void dfs(int u)
{
vis[u] = ;
for(int id = head[u];id;id = e[id].Next){
int v = e[id].to;
if(vis[v]) continue;
f[v] = Find(f[u]);
dfs(v);
}
}
int add(int u)
{
for(int id = head[u];id;id = e[id].Next){
int v = e[id].to;
if(vis[v] == ) continue;
int fv = Find(v);
if(f[u] == u){f[u] = fv;continue;}
if(f[u] != u && f[u] != fv) sum--;
f[fv] = f[u];
}
if(f[u] == u) sum++;//孤立节点
}
int main()
{
int n,m,k,u,v;
scanf("%d%d",&n,&m);
init();
for(int i = ;i < m;i++){
scanf("%d%d",&u,&v);
ins(u,v);ins(v,u);
}
scanf("%d",&k);
for(int i = ;i < k;i++){
scanf("%d",del + i);
vis[del[i]] = ;//2表示删除的节点,1表示在图中的节点
}
sum = ;
for(int i = ;i < n;i++) f[i] = i;
for(int i = ;i < n;i++)if(!vis[i]) dfs(i),sum++;
ans[k] = sum;
for(int i = k - ;i >= ;i--){
add(del[i]),vis[del[i]] = , ans[i] = sum;
}
for(int i = ;i <= k;i++) printf("%d\n",ans[i]);
}
【BZOJ】1015: [JSOI2008]星球大战starwar的更多相关文章
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集
1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...
- BZOJ 1015 [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3551 Solved: 1581[Submit ...
- bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)
链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆 ...
- BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)
http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...
- BZOJ 1015 JSOI2008 星球大战 starwar 并检查集合
标题效果:给定一个无向图.联通谋求块的数目,以及k一个点的破坏后每次:联通,块的数目 侧面和摧毁的地步全记录,我们可以做相反的. 需要注意的是该点不能算作破坏联通块 #include<cstdi ...
- BZOJ 1015: [JSOI2008]星球大战starwar【并查集】
题目可以表述成:给定一个无向图G,每次删除它的一个点和与点相关的边集,每次询问该操作后图G的连通度(连通分量的个数).和上一题一样都是考察逆向思维,虽然删除点的做法不会,但是每次加点后询问连通度却是并 ...
- 1015: [JSOI2008]星球大战starwar
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Description 很久以前,在一个遥远的星系,一个黑暗的帝国 ...
- [1015][JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 2124 Solved: 909[Submit] ...
- bzoj1015:1015: [JSOI2008]星球大战starwar
应该是全部读入之后再添加边用并查集就可以了. yyl用空间换时间.u[]v[]等将边预存起来. #include<cstdio> #include<cstring> #incl ...
随机推荐
- linux之ubuntu下php环境配置
本文主要说明如何在Ubuntu下配置PHP开发环境LAMP. Ubuntu 搭建 php 环境 所谓LAMP:Linux,Apache,Mysql,PHP 安装 Apache2:(注意可以 ...
- php开发环境以及插件的配置安装
目前网上提供的常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XAMPP等软件
- js之createTextRange方法
createTextRange()方法作用: 主要是用来对一些文本对象进行操作.比如你有一大段文字,都在同一个P标签内,但是你只希望通过JS改变其中的一小部分,这时就可以用createTextRang ...
- Flex学习第一天(两个数相加)
<?xml version="1.0" encoding="utf-8"?><s:Application xmlns:fx="htt ...
- eclipse安装插件的方法,以python为例子
一 转载自:http://www.cnblogs.com/linzhenjie/articles/2639113.html 1.基本需求 1.Eclipse 集成开发环境下载 http://115.c ...
- JAVA_java关联源码
java怎样关联源码?? 1,按住control键,点一下你要看源码的类,跳到如下界面: 2,单击,跳到下一个界面 3,继续,找到jdk按照路径,找到src.zip文件 4. 4. 点击OK就可以看源 ...
- 本地环境phpStorm10+XDebug配置和断点调试
安装环境:XAMPP;phpStorm版本10; windows 7 64bit. XAMPP.phpStorm 都直接安装在了D盘根目录,9999m目录建在D:\xampp\htocts下,即目录工 ...
- dedecms安装步骤
GD支持:PHP设置-PHP扩展-php_gd2 初始化数据体验包:点击下载:或者点击取消 如果是本地安装在数据库的在数据库用户名选择默认的(root),密码为空 主要是如果是基于远程服务器的 ...
- Linux find常见用法示例
find命令的参数: pathname: find命令所查找的目录路径.例如用.来表示当前目录,用/来表示系统根目录.-print: find命令将匹配的文件输出到标准输出.-exec: find命令 ...
- 第六篇、CSS属性
<!--1.可继承性 visible(可见的):hidden --掩藏,但是结构还保存 cursor(光标样式):pointer(手指)crosshair(十字架) 一般是文字控制属性 内联标签 ...