[JSOI2008]Star War
星球之间互相直接或间接地连接
帝国开始使用死星有计划地摧毁反抗军占领的星球
给出星球间隧道的连通情况,已经帝国打击的顺序
要求以尽量快的速度求出每一次打击之后反抗军占据的星球的联通快的个数(若两个星球,直接或间接的通过现存的通道连接,则视为在一个联通块
输入格式:
第一行两个整数n, m,分别表示星球的数目和隧道的数目
接下来M行,每行两个整数x, y,表示星球x和y之间相连
接下来一个整数k,表示将要被摧毁的星球的数目
接下来k行,每行一个整数,按照顺序列出了帝国军的攻击目标
输出格式:
第一行是开始时星球的联通块个数,接下来k行,每行一个整数,表示经过打击后现存星球的联通块的个数
样例输入
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
1
1
2
3
3
我们首先可以想到的是,直接用dfs暴力求连通块会超
很好,那么我们就只有(大概?)一个选择了:并查集维护连通性的同时解决问题
我们发现,题目进行的是删点操作,懂我的意思吧,并查集的维护是合并操作,不是删除操作
然后我们感觉思路有些迷迷糊糊,总感觉要通了,但还是卡的
那就把思考方向换一下。
如果最初默认删掉所有要删的点,然后倒着把要删的点一个一个修回去
很好,求解的答案没有出现差错
最初我们先预求出删掉所有要删的点后,连通块的数量
然后一个一个地往回加点。知道吧所有点加齐
最初预求删完所有点后连通块的数量的同时,将点与点之间父子关系连好
然后修点时再将与要修的点直接相连的点合并在要修的点上,同时维护连通块的数量,记录答案
具体实现和思路代码体会
(保证简单易懂)
#include<bits/stdc++.h>
using namespace std;
const int maxn = ;
struct enkidu {
int y, nex, x;
}e[maxn];
int lin[maxn], len = ;
int aim[maxn];//表示要摧毁哪些星球
int n, m, k;
int fa[maxn], ans[maxn];
int vis[maxn];//判断有没有被炸 inline int read() {
int x = , y = ;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') y = -;
ch = getchar();
}
while(isdigit(ch)) {
x = (x << ) + (x << ) +ch - '';
ch = getchar();
}
return x * y;
} inline void insert(int xx, int yy) {
e[++len].y = yy;
e[len].x = xx;
e[len].nex = lin[xx];
lin[xx] = len;
} int getfather(int x) {
if(x == fa[x]) return x;
return fa[x] = getfather(fa[x]);
} int main() {
memset(lin, -, sizeof(lin));
n = read(), m = read();
for(int i = ; i < n; ++i) fa[i] = i;
for(int i = ; i <= m; ++i) {
int x, y;
x = read(), y = read();
insert(x, y);
insert(y, x);
}
k = read();
int num = n - k;//k次打击后,还剩下点的数量
for(int i = ; i <= k; ++i) {
int star;
star = read();
vis[star] = ;
aim[i] = star;
}
for(int i = ; i <= * m; ++i) {
int x = e[i].x, y = e[i].y;
if(!vis[x] && !vis[y]) {
int u = getfather(x);
int v = getfather(y);
if(u != v) {//计算打击了k次后的连通块数量
num--;//表示有一对没有搜过的点连通,连通块数量减一
fa[v] = fa[u];
}
}
}
ans[k + ] = num;//k次打击后剩的连通块数量
//cout << num << '\n';
for(int i = k; i >= ; --i) {
num++;
int force = aim[i];
vis[force] = ;
//cout << num << '\n';
int u = getfather(force);
//cout << u << '\n';
for(int j = lin[force]; j != -; j = e[j].nex) {
//cout << j << '\n';
int to = e[j].y;
if(!vis[to]) {
int v = getfather(to);
if(u != v) {
num--;
fa[v] = u;
}
}
}
ans[i] = num;
}
for(int i = ; i <= k + ; ++i)
cout << ans[i] << '\n';
return ;
}
[JSOI2008]Star War的更多相关文章
- BZOJ1015 并查集
1015: [JSOI2008]星球大战star war Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了 ...
- [Angular2 Router] Optional Route Query Parameters - The queryParams Directive and the Query Parameters Observable
In this tutorial we are going to learn how to use the Angular 2 router to pass optional query parame ...
- 英语口语练习系列-C15-心情不好
单词 1. artist [ˈɑ:tɪst] n. 艺术家 a great artist 一名伟大的艺术家 a Chinese artist 一名中国艺术家 2. beef [bi:f] n. 牛肉 ...
- 英语口语练习系列-C12-不了解
词汇 air [eə(r)] n. 空气 fresh air 新鲜的空气 warm air 暖暖的空气 I like to air the room. 我喜欢给房间通气. on the air 正在播 ...
- elasticsearch 搜索提示DSL
1,创建mapping: PUT /news_website { "mappings": { "news" : { "properties" ...
- [Udemy] ES 7 and Elastic Stack - part 2
Section 3: Searching with Elasticsearch query with json 分页返回 Sort full text 的内容不能用来sort, 比如movie的 ti ...
- 科幻电影免费百度云分享(Scince-fiction cloud share)
Marvel episode Link Passcode:6h9k Star War full episode Link Passcode:7abk Men In Black Episode Col ...
- ElasticSearch 搜索模板与建议
公号:码农充电站pro 主页:https://codeshellme.github.io Search APIs 用于搜索和聚合存储在 ES 中的数据. 1,搜索模板 Template Search ...
- 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)
这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...
随机推荐
- JS调用C#中的变量
今天早上做项目,需要使用JS来得到数据库里面表的行数.经过查找资料,知道可以使用在C#中定义一个全局变量.在JS中调用即可,自己总结一下:供日后参考; public string Str() { st ...
- P1118 [USACO06FEB]数字三角形`Backward Digit Su`…
题目描述 FJ and his cows enjoy playing a mental game. They write down the numbers from 11 to N(1 \le N \ ...
- [洛谷P3203][HNOI2010]弹飞绵羊
题目大意:有$n$个节点,第$i$个节点有一个弹力系数$k_i$,当到达第$i$个点时,会弹到第$i+k_i$个节点,若没有这个节点($i+k_i>n$)就会被弹飞.有两个操作: $x:$询问从 ...
- 一个JavaScript日期格式化扩展函数
我们都知道在Java和PHP语言中,有专门用于格式化日期对象的类和函数,例如Java中的DateFormat等等,通过这些类和函数,我们可以方便的将一个日期对象按照格式的要求输出为字符串,例如对于同一 ...
- oracle数据库导入导出方法
Oracle Database 10g以后引入了最新的数据泵(Data Dump)技术,使DBA或开发人员可以将数据库元数据(对象定义)和数据快速移动到另一个oracle数据库中. 数据泵导出导入(E ...
- The 13th Zhejiang Provincial Collegiate Programming Contest - D
The Lucky Week Time Limit: 2 Seconds Memory Limit: 65536 KB Edward, the headmaster of the Marja ...
- git学习,哇瑟说实话我想要的
1.Git 简介及安装Git是目前世界上最先进的分布式版本控制系统(没有之一).它的诞生也颇具传奇,Linux创始人Linus花了两周时间自己用C写了一个分布式版本控制系统,这就是Git!有兴趣的话, ...
- Java中Class<T>与Class<?>的区别
E - Element (在集合中使用,因为集合中存放的是元素) T - Type(Java 类) K - Key(键) V - Value(值) N - Number(数值类型) ? - 表示不确定 ...
- 使用eclipse插件创建一个web project
使用eclipse插件创建一个web project 首先创建一个Maven的Project如下图 我们勾选上Create a simple project (不使用骨架) 这里的Packing 选择 ...
- Navicat Premium mysql
#Sql语句 创建一表格 ),name ),age ),sex )); #添加语句 ,,'男'); ,,'男'); #删除 delete from user3;#user3中所有数据全删 delete ...