题目大意

  给你一张\(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】星球大战 并查集相关推荐

  1. bzoj1015 [JSOI2008]星球大战 并查集

    对于这种连续删边的问题,可以离线,这样就变成了加边,usaco有类似的题.. 码: #include<iostream> #include<cstdio> #include&l ...

  2. [JSOI2008]星球大战 并查集

    这一阵子因为好多原因,学习时间有点少,还好时间不算很长. 这两天写了道并查集的题目,感觉不错. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶 ...

  3. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3895  Solved: 1750 [Subm ...

  4. [BZOJ1015] [JSOI2008] 星球大战starwar (并查集)

    Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的 机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通 ...

  5. BZOJ1015 JSOI2008 星球大战starwars 并查集

    题意:给定一张无向图,不断从图上删点,询问每次删点后联通块的数量 题解:离线,在删完点后的图上不断加点,用并查集维护联通性. #include <cstdio> #include < ...

  6. P1197 [JSOI2008]星球大战 题解

    题目:P1197 [JSOI2008]星球大战 并查集 - 图论 - 连通块 题目大意 给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号 敌人依次攻击这 ...

  7. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

  8. 【JSOI2008】星球大战 (并查集)

    题面 Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星 ...

  9. 【BZOJ1015】【tyvj3487】星球大战starwar,特别的并查集技巧

    传送门1 传送门2 写在前面:无 思路:比较简单的并查集题目,正着做很难,我们可以倒着想,询问倒着排,相当于每次加入一个星球并把可以连的边都连上,查一下联通块数量就行了 注意:必须两个顶点都没有被摧毁 ...

最新文章

  1. Wine 1.0 RC2
  2. predicate java_java代码之美(13)--- Predicate详解
  3. is_numeric函数的引起的一个BUG说起
  4. Javascript 盲区和 操作实例 笔记
  5. php背景图片随页面大小改变,css背景图根据屏幕大小自动缩放
  6. 图论基础知识--最小生成树算法kruskal(克鲁斯克尔)和普里姆算法(Prim算法);最短路径算法Dijkstra(迪杰斯特拉)和Floyd(弗洛伊德)
  7. 如何让 PPT 像 PyeCharts 一样炫酷?
  8. perl system函数返回值问题
  9. PyTorch 中如何指定GPU
  10. Flex走出低谷的关键: 打破Flex固有的定义
  11. Spring的9种设计模式(一)
  12. c语言合并两个顺序表算法,顺序表的两种合并操作(C语言)
  13. 深入理解connect by levelxxx
  14. C#—得到服务器时间和国际标准时间
  15. Android软键盘的含义IME_ACTION_NEXT
  16. 我的世界java内存不足_我的世界:使用启动器开MC,提示内存过大?我教你怎么解决...
  17. JAVA基础 第二篇:阶乘
  18. javascript幻灯片播放(随机)
  19. 推荐系统冷启动问题及解决
  20. 显示器分辨率、刷新率对HDMI和DP线材要求

热门文章

  1. 卡尺测量的最小范围_工厂车间里常用的测量仪器使用方法介绍,你都会用吗?...
  2. android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...
  3. python 64位程序 打包用于32位系统_python分别打包出32位和64位应用程序
  4. 平方变换载波同步 matlab,matlab源码-costas载波同步环.docx
  5. 打印出两个set中差集_Java之两个Set集合的交集、差集和并集
  6. 如何安装新linux内核,详解Debian系统中安装Linux新内核的流程
  7. getinstance方法详解_二、设计模式总览及工厂模式详解
  8. ajax走error的条件,Ajax进入ERROR的部分条件总结
  9. 计算机音乐戏子多秋,抖音戏子多秋是什么歌
  10. 华为atn980传输设备_注册开发者超200万!华为HMS加速全球布局,打造全场景智慧体验...