【JSOI2008】星球大战 并查集
题目描述
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系。
某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。
但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。
现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通块的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
输入输出格式
输入格式:
输入文件第一行包含两个整数,NN (1 < = N < = 2M1<=N<=2M) 和 MM (1 < = M < = 200,0001<=M<=200,000),分别表示星球的数目和以太隧道的数目。星球用 00 ~ N-1N−1 的整数编号。
接下来的 MM 行,每行包括两个整数 XX, YY,其中( 0 < = X <> Y0<=X<>Y 表示星球 xx 和星球 yy 之间有 “以太” 隧道,可以直接通讯。
接下来的一行为一个整数 kk ,表示将遭受攻击的星球的数目。
接下来的 kk 行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这 kk 个数互不相同,且都在 00 到 n-1n−1的范围内。
输出格式:
第一行是开始时星球的连通块个数。接下来的 KK 行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
输入输出样例
8 13
0 1
1 6
6 5
5 0
0 6
1 2
2 3
3 4
4 5
7 1
7 2
7 6
3 6
5
1
6
3
5
7
1
2
3
3
--------------------------------------------------- 好的这道题一眼是个并查集(其实是按专题在做qwq 遇到的是一个常用但我没见过的套路
题目要求查询的是依次毁灭后的情形 但如果真的要顺向查找连通块确实有点过于暴力
这时候 我们要做的是反向建立图并完成并查集操作
有一个细节是:要将最后一个点先单独操作 其余点在一遍循环中操作 这样比较好记答案 而且不能随意将最后一步的点直接vis[u]=0;
算法离线 每一次取最后被ban掉的点 将与之相连的边和点插入并查集中合并 同时计算连通块的个数
怎么计算连通块的个数呢?
蒟蒻的我只想到了暴力每次求不同的祖先数
聪明的办法是:每加入一个新点(之前被ban掉的)时,连通块数量++ ;遍历时每发现一个没有在并查集中 但与当前点有边相连 的点,合并之后连通块数量--;
这样就ok了
像这样在处理过程中就进行答案累积的类似的思路还有计算最短路条数时,如果在最短路上 则ans[v]=ans[u]; 否则如果dis[v]==dis[u]+1 ans[v]=ans[u]+1;
千万不要每次一想到记答案就要重头遍历啊!
贴个代码
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
#define N 401100
using namespace std;
int n,m,k,tot;
struct node
{
int u,v,w,nxt;
}e[N*];
int first[N],cnt;
void ade(int u,int v)
{
e[++cnt].nxt=first[u]; first[u]=cnt;
e[cnt].u=u; e[cnt].v=v;
}
int fa[N*];
int la(int x)
{
if(fa[x]!=x) return fa[x]=la(fa[x]);
else return fa[x];
}
void combine(int x,int y)
{
int xx=la(x),yy=la(y);
if(xx!=yy)
{
fa[xx]=yy; tot--;
}
}
int ak[N*];
bool vis[N*];
int col[N*];
int main()
{
scanf("%d%d",&n,&m);
for(int i=,x,y;i<=m;i++)
{
scanf("%d%d",&x,&y);
ade(x+,y+); ade(y+,x+);
}
for(int i=;i<=n;i++) fa[i]=i;
scanf("%d",&k);
for(int i=;i<=k;i++)
{
scanf("%d",&ak[i]);
ak[i]++;
vis[ak[i]]=;
}
tot=n-k;
for(int u=;u<=n;u++)
{
if(vis[u]) continue;
for(int i=first[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v]) continue;
combine(u,v);
}
}
col[k+]=tot;
for(int pu=k;pu>=;pu--)
{
int u=ak[pu];
vis[u]=;
tot++;
for(int i=first[u];i;i=e[i].nxt)
{
int v=e[i].v;
if(vis[v]) continue;
combine(u,v);
}
col[pu]=tot;
}
for(int i=;i<=k+;i++)
printf("%d\n",col[i]);
return ;
}
要看吗ovo
【JSOI2008】星球大战 并查集的更多相关文章
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ...
- JSOI2008 星球大战 [并查集]
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- P1197 [JSOI2008]星球大战[并查集+图论]
题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ...
- P1197 [JSOI2008]星球大战 并查集 反向
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...
- [bzoj1015][JSOI2008]星球大战——并查集+离线处理
题解 给定一张图,支持删点和询问连通块个数 按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的 我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理 ...
- 洛谷 P1197 [JSOI2008]星球大战——并查集
先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ...
- BZOJ_1015_星球大战_[JSOI2008]_(并查集)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1015 n 个点,被 m 条边相连.进行k次删点操作,问第一次操作前和每次操作后的集合数(直接或 ...
- 【BZOJ1015】【JSOI2008】星球大战 并查集
题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ...
- BZOJ-1015 StarWar星球大战 并查集+离线处理
1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ...
随机推荐
- Python之自定义封装一个简单的Log类
参考:http://www.jb51.net/article/42626.htm 参考:http://blog.csdn.net/u011541946/article/details/70198676 ...
- JSP学习 三大指令、九个内置对象、JavaBean、EL表达式
1.page-->最复杂:<%@page language="java" info="xxx"...%> * pageEncoding和con ...
- vue+node+mongodb实现的页面
源代码地址:https://github.com/GainLoss/vue-node-mongodb 目前这个项目实现的是: 1.利用vue-cli实现前台页面的编写 (1)页面的跳转利用的是vue- ...
- 撸了个 django 数据迁移工具 django-supertube
撸了个 django 数据迁移工具 django-supertube 支持字段映射和动态字段转化. 欢迎 star,issue https://github.com/FingerLiu/django- ...
- bzoj1189 [HNOI2007]紧急疏散
Description 发生了火警,所有人员需要紧急疏散!假设每个房间是一个N M的矩形区域.每个格子如果是'.',那么表示这是一块空地:如果是'X',那么表示这是一面墙,如果是'D',那么表示这是一 ...
- fast rcnn训练自己数据小结
1.http://blog.csdn.net/hao529good/article/details/46544163 我用的训练好的模型参数是data/fast_rcnn__models/vgg_ ...
- python_31_集合
# 集合是一个无序的,不重复的数据组合,它的主要作用如下: # 去重,把一个列表变成集合,就自动去重了 # 关系测试,测试两组数据之前的交集.差集.并集等关系 s = set([3, 5, 9, 10 ...
- wing ide 注释
ctrl-.是批量注视 ctrl->向前缩进 ctrl-<向后缩进
- iOS开发遇到的坑之七--上传app Stroe被拒绝:The app references non-public symbols in : _UICreateCGImageFromIOSurface
这是上学期遇到的问题了,突然查阅邮箱的时候发现了,遂在这里记录下来,希望大家以后注意这个问题 我上传App Store的时候,apple给我发的邮件原文: Dear developer, We hav ...
- SAP系统管理中常见问题解答(转载)
1.如何查看SAP系统的位数? system——status看 Platform ID Platform 32-bit 64-bit --------------------------------- ...