【BZOJ1015】【JSOI2008】星球大战 并查集
题目大意
给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数。
\(q\leq n\leq 400000,m\leq 200000\)
题解
我们可以用并查集维护连通块个数,可惜并查集不支持删除操作。
但是这道题没有强制在线,所以可以先删完所有点后再一个个加回来。
加边的时候维护连通块个数。
时间复杂度:\(O(n\alpha(n))\)
代码
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cstdlib>
#include<ctime>
#include<utility>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef pair<int,int> pii;
struct graph
{int v[1000010];int t[1000010];int h[1000010];int n;graph(){n=0;memset(h,0,sizeof h);}void add(int x,int y){n++;v[n]=y;t[n]=h[x];h[x]=n;}
};
graph g;
int f[1000010];
int b[1000010];
int x[1000010];
int y[1000010];
int c[1000010];
int s[1000010];
int r[1000010];
int find(int x)
{return f[x]==x?x:f[x]=find(f[x]);
}
int merge(int x,int y)
{x=find(x);y=find(y);if(x==y)return 0;if(r[x]>r[y])swap(x,y);f[x]=y;if(r[x]==r[y])r[y]++;return 1;
}
int main()
{int n,m;scanf("%d%d",&n,&m);int i;for(i=1;i<=n;i++){b[i]=1;f[i]=i;r[i]=1;}for(i=1;i<=m;i++){scanf("%d%d",&x[i],&y[i]);x[i]++;y[i]++;g.add(x[i],y[i]);g.add(y[i],x[i]);}int q;scanf("%d",&q);int ans=n;for(i=1;i<=q;i++){scanf("%d",&c[i]);c[i]++;b[c[i]]=0;ans--;}int j;for(i=1;i<=n;i++)if(b[i])for(j=g.h[i];j;j=g.t[j])if(b[g.v[j]])ans-=merge(i,g.v[j]);s[q]=ans;for(i=q;i>=1;i--){b[c[i]]=1;ans++;for(j=g.h[c[i]];j;j=g.t[j])if(b[g.v[j]])ans-=merge(c[i],g.v[j]);s[i-1]=ans;}for(i=0;i<=q;i++)printf("%d\n",s[i]);return 0;
}
转载于:https://www.cnblogs.com/ywwyww/p/8513308.html
【BZOJ1015】【JSOI2008】星球大战 并查集相关推荐
- bzoj1015 [JSOI2008]星球大战 并查集
对于这种连续删边的问题,可以离线,这样就变成了加边,usaco有类似的题.. 码: #include<iostream> #include<cstdio> #include&l ...
- [JSOI2008]星球大战 并查集
这一阵子因为好多原因,学习时间有点少,还好时间不算很长. 这两天写了道并查集的题目,感觉不错. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶 ...
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 3895 Solved: 1750 [Subm ...
- [BZOJ1015] [JSOI2008] 星球大战starwar (并查集)
Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...
- BZOJ1015 JSOI2008 星球大战starwars 并查集
题意:给定一张无向图,不断从图上删点,询问每次删点后联通块的数量 题解:离线,在删完点后的图上不断加点,用并查集维护联通性. #include <cstdio> #include < ...
- P1197 [JSOI2008]星球大战 题解
题目:P1197 [JSOI2008]星球大战 并查集 - 图论 - 连通块 题目大意 给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号 敌人依次攻击这 ...
- 洛谷 p1197 [JSOI2008]星球大战(并查集)
洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...
- 【JSOI2008】星球大战 (并查集)
题面 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星 ...
- 【BZOJ1015】【tyvj3487】星球大战starwar,特别的并查集技巧
传送门1 传送门2 写在前面:无 思路:比较简单的并查集题目,正着做很难,我们可以倒着想,询问倒着排,相当于每次加入一个星球并把可以连的边都连上,查一下联通块数量就行了 注意:必须两个顶点都没有被摧毁 ...
最新文章
- Wine 1.0 RC2
- predicate java_java代码之美(13)--- Predicate详解
- is_numeric函数的引起的一个BUG说起
- Javascript 盲区和 操作实例 笔记
- php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放
- 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
- 如何让 PPT 像 PyeCharts 一样炫酷?
- perl system函数返回值问题
- PyTorch 中如何指定GPU
- Flex走出低谷的关键: 打破Flex固有的定义
- Spring的9种设计模式(一)
- c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
- 深入理解connect by levelxxx
- C#—得到服务器时间和国际标准时间
- Android软键盘的含义IME_ACTION_NEXT
- 我的世界java内存不足_我的世界:使用启动器开MC,提示内存过大?我教你怎么解决...
- JAVA基础 第二篇:阶乘
- javascript幻灯片播放(随机)
- 推荐系统冷启动问题及解决
- 显示器分辨率、刷新率对HDMI和DP线材要求
热门文章
- 卡尺测量的最小范围_工厂车间里常用的测量仪器使用方法介绍,你都会用吗?...
- android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...
- python 64位程序 打包用于32位系统_python分别打包出32位和64位应用程序
- 平方变换载波同步 matlab,matlab源码-costas载波同步环.docx
- 打印出两个set中差集_Java之两个Set集合的交集、差集和并集
- 如何安装新linux内核,详解Debian系统中安装Linux新内核的流程
- getinstance方法详解_二、设计模式总览及工厂模式详解
- ajax走error的条件,Ajax进入ERROR的部分条件总结
- 计算机音乐戏子多秋,抖音戏子多秋是什么歌
- 华为atn980传输设备_注册开发者超200万!华为HMS加速全球布局,打造全场景智慧体验...