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的更多相关文章

  1. BZOJ 1015: [JSOI2008]星球大战starwar 并查集

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

  2. BZOJ 1015 [JSOI2008]星球大战starwar

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

  3. bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)

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

  4. BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)

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

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

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

  6. BZOJ 1015: [JSOI2008]星球大战starwar【并查集】

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

  7. 1015: [JSOI2008]星球大战starwar

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

  8. [1015][JSOI2008]星球大战starwar(并查集)

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

  9. bzoj1015:1015: [JSOI2008]星球大战starwar

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

随机推荐

  1. 【转】字符串分割(C++)

    原文:http://www.cnblogs.com/MikeZhang/archive/2012/03/24/mysplitfuncpp.html 经常碰到字符串分割的问题,这里总结下,也方便我以后使 ...

  2. Memcached source code analysis (threading model)--reference

    Look under the start memcahced threading process memcached multi-threaded mainly by instantiating mu ...

  3. 1、C语言中的函数指针

    一 通常的函数调用 void MyFun(int x); //此处的申明也可写成:void MyFun( int ); int main(int argc, char* argv[]) { MyFun ...

  4. MySQL(8):数值类型详细分析

    1.日期和时间类型 2.varchar和char 固定长度 (char) 或可变长度 (varchar) 字符数据类型.  例如: a char(10)b varchar(10)都存入'abc'a要求 ...

  5. Android_Notification

    xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns ...

  6. JAVA_Gson

    package com.qf.mobiletrain01; import java.util.List; import com.google.gson.Gson; import com.google. ...

  7. Web安全测试周末公开班计划5月24、25日开课,欢迎报名参加!

    Web安全测试周末公开班计划5月24.25日开课,欢迎报名参加! 课程大纲参考: http://gdtesting.com/product.php?id=107 报名咨询: 黎小姐 QQ:241448 ...

  8. posix thread线程

    1. pthread线程通过调用你提供的某些函数开始.这个“线程函数”应该只有一个void*型参数,并返回系统的类型.2. 通过向pthread_create函数传递线程函数的地址和线程函数调用的参数 ...

  9. 使用kdbg或nemiver调试ROS

    Kdbg Kdbg是KDE环境下的一个gdb的前端GUI,使用起来比较友好,速度也很快,安装和使用请参考: http://www.kdbg.org/ 在UBUNTU下可以直接使用APT安装: sudo ...

  10. linux commond

    1  vi /etc/sysconfig/network-scripts/ifcfg-eth0     2  ifconfig    3  ping 172.22.14.59    4  ping 1 ...