【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;
}
【BZOJ1015】【JSOI2008】星球大战 并查集的更多相关文章
- [bzoj1015][JSOI2008]星球大战——并查集+离线处理
		题解 给定一张图,支持删点和询问连通块个数 按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的 我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理 ... 
- BZOJ-1015  StarWar星球大战   并查集+离线处理
		1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ... 
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
		题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ... 
- JSOI2008 星球大战 [并查集]
		题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ... 
- P1197 [JSOI2008]星球大战[并查集+图论]
		题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ... 
- P1197 [JSOI2008]星球大战  并查集 反向
		题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ... 
- 洛谷 P1197 [JSOI2008]星球大战——并查集
		先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ... 
- BZOJ1015[JSOI2008]星球大战starwar[并查集]
		1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 5253 Solved: 2395[Submit ... 
- BZOJ1015  [JSOI2008]星球大战starwar(并查集)
		1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 3895 Solved: 1750[Submit ... 
- [Bzoj1015][JSOI2008]星球大战starwar(并查集)(离线处理)
		1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MBSubmit: 6849 Solved: 3204[Submit ... 
随机推荐
- Jq相关常用操作
			1.select下拉列表操作 $(".kstitle").live('change', function () { var workType = $(this).val(); // ... 
- Python-Urllib库详解
			官方文档地址:https://docs.python.org/3/library/urllib.html 什么是Urllib: Urllib是python内置的HTTP请求库: urllib.requ ... 
- H5 标签选择器
			08-标签选择器 我是段落 我是段落 我是段落 我是段落 我是段落 我是标题 <!DOCTYPE html> <html lang="en"> <he ... 
- 书城项目第五阶段---book表的curd
			JavaEE三层架构分析 MVC 
- java 8中抽象类与接口的异同
			1.java 8中抽象类与接口的异同 相同点: 1)都是抽象类型: 2)都可以有实现方法(以前接口不行): 3)都可以不需要实现类或者继承者去实现所有方法,(以前不行,现在接口中默认方法不需要实现者实 ... 
- ntpd、ntpdate、hwclock的区别
			hwclock --systohc 使用ntpdate更新系统时间 - 潜龙勿用 - CSDN博客https://blog.csdn.net/suer0101/article/details/7868 ... 
- Windows和Linux的Jmeter分布式集群压力测试
			Windows的Jmeter分布式集群压力测试 原文:https://blog.csdn.net/cyjs1988/article/details/80267475 在使用Jmeter进行性能测试时, ... 
- 搞站思路 <陆续完善中>
			只提供思路经验分享.不提供日站方法....一般站点那里最容易出现问题 入手思路: 主站一般都很安全.一般从二级域名下手 多看看那些大站新出来的测试分站点 猜路径别忘了google 考虑看站点下的rob ... 
- angularjs4+ionic3集成搭建
			1:安装一下cnpm用淘宝镜像安装npm install -g cnpm --registry=https://registry.npm.taobao.org 2:使用 cnpm命令安装(全局安装 A ... 
- 重构客户注册-基于ActiveMQ实现短信验证码生产者
			重构目标:将bos_fore项目中的CustomerAction作为短信消息生产者,将消息发给ActiveMQ,创建一个单独的SMS项目,作为短信息的消费者,从ActiveMQ获取短信消息,调用第三方 ... 
