【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 ...
随机推荐
- 【转】Singleton单例模式
对于系统中的某些类来说,只有一个实例很重要,例如,一个系统中可以存在多个打印任务,但是只能有一个正在工作的任务:一个系统只能有一个窗口管理器或文件系统:一个系统只能有一个计时工具或ID(序号)生成器. ...
- VB.NET中使用代表对方法异步调用
按照我们常规的思维方式,计算机应该是干完一件事,然后再干下一件.用术语来说,这种执行任务的方式叫做同步执行(Synchronous Execution).既然这样,那么为什么要引入异步执行的概念呢? ...
- datagrid rownumber行号与数据行显示错位的解决办法
最近在使用datagrid控件,遇到问题多多. 其中一个就是datagrid在使用行编号的情况下,行编号与数据行出现错位的情况,如图:
- Android_CntextMenu_example_textSize
menu.xml <menu xmlns:android="http://schemas.android.com/apk/res/android" > <item ...
- typeid关键字
这么看下去太要命了,有太多东西要学了... 而且视频看起来的确费神,费脑,费耳朵. 所以决定由视频驱动转向代码驱动.主攻vs,c++然后先把界面东西做出来,然后在想后面的东西. 所以今天 [先上来看了 ...
- C语言里的文件函数
1.File *pf = fopen("文件名","打开方式"); 文件名可以加路径,两个"\\"或者一个"/" 打开方 ...
- win7 cmd命令行窗口 宽度无法变大 自由调整大小
偶然遇到了这个问题,百度查到了解决方案,执行一个bat批处理命令. mode con lines=40 mode con cols=160 color 250 cls @cmd
- Linux 查看文件修改
在以前知道在Linux下查看Tomcat日志文件, tail -f catalina.out 同样的命令"tail -f filename",我就可以看其它日志文件啦: tail ...
- .NET学习笔记(2) — IIS服务器环境搭建
目录 一:开启Windows系统自带的IIS服务器方法 二:备注 三:常见问题 一:开启Windows系统自带的IIS服务器方法 第一步:安装IIS,控制面板->程序和功能-> ...
- dedecms获取字段
在详情页中调用字段使用{dede:field name='title’/} 在列表页调用字段使用: {dede:list} 我是标题:[field:title/],我的的url:[field:youk ...