【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 ...
随机推荐
- com.domain.bean
package com.domain.bean; import java.util.LinkedHashMap; import java.util.Map; public class TmpBean ...
- java_jdbc_batch处理_主键id获取
//create1 速度较慢,create2较快,但是要根据数据库不同来决定 //ps = conn.prepareStatement(sql, Statement.RETURN_GENERATED_ ...
- linux vi 撤销重做于前进后退--转
在vi中按u可以撤销一次操作 u 撤销上一步的操作Ctrl+r 恢复上一步被撤销的操作 注意:如果你输入“u”两次,你的文本恢复原样,那应该是你的Vim被配置在Vi兼容模式了.重做如果你撤销得太多 ...
- oracle11g密码大小写敏感问题
密码大小写敏感是Oracle 11g数据库默认的一个新特性,数据库配置助手(DBCA)在创建数据库期间允许你将这个设置返回到11g以前的功能. SEC_CASE_SENSITIVE_LOGON初始化参 ...
- 学习jQuery后的部分总结
1.remove和empty <div id="div1"> <ul id="ul1"> <li>嘿嘿</li> ...
- js中一些容易混淆的方法
JavaScript中有一些名字十分冗长的函数名称,导致使用时会混乱,特此整理一番,加深印象. ①Object.getOwnPropertyDescriptor --读取某个对象特定属性的属性 ...
- switch case 与 if
case 在编程中偶尔使用到switch case语句,对于case语句的处理,出现了两种错误,现总结如下: case后必须是常量.布尔类型.字符(不能是字符串): case后如果是‘||’或者‘&a ...
- TextView设置动态改变颜色
通过TextView的setTextColor方法进行文本颜色的设置, 这里可以有3种方式进行设置: 第1种:tv.setTextColor(android.graphics.Color.RED);/ ...
- java基础学习总结六(对象与类、类的属性与方法)
一:面向过程与面向对象的区别 举例:一个人开门的动作,可以分解为开门,人进去,关门. 面向过程:人作为执行者,1:开门 2:进入 3:关门 面向对象:人作为指挥者,将开门,关门的动作都封装到门上 ...
- 【汉诺塔问题】UVa 10795 - A Different Task
[经典汉诺塔问题] 汉诺(Hanoi)塔问题:古代有一个梵塔,塔内有三个座A.B.C,A座上有64个盘子,盘子大小不等,大的在下,小的在上.有一个和尚想把这64个盘子从A座移到B座,但每次只能允许移动 ...