[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)
这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...
随机推荐
- BZOJ4488 JSOI2015最大公约数
显然若右端点确定,gcd最多变化log次.容易想到对每一种gcd二分找最远端点,但这样就变成log^3了.注意到右端点右移时,只会造成一些gcd区间的合并,原本gcd相同的区间不可能分裂.由于区间只有 ...
- SDOI 2009 学校食堂 状压dp
这个题的关键处1 紧跟着他的bi个人 —— 由此得出任意一个状态都可以表示为 有第一个人没吃到饭做分隔的前面所有人已吃饭,并用1<<8表示之后的(包括他)的八个人的状态2 信息仍然是上一个 ...
- JQuery中的each()的使用
each()函数是基本上所有的框架都提供了的一个工具类函数,通过它,你可以遍历对象.数组的属性值并进行处理. jQuery和jQuery对象都实现了该方法,对于jQuery对象,只是把each方法简单 ...
- sshd_conf配置
# $OpenBSD: sshd_config,v 1.80 2008/07/02 02:24:18 djm Exp $ # This is the sshd server system-w ...
- Astah画时序图
Astah画时序图,666 1.生命线 时序图中表示为从对象图标向下延伸的一条虚线,表示对象存在的时间, 一般用来描述 系统 :如 客户端,代理层,缓存层,服务器层1.....服务器层N,数据库等. ...
- JavaScript创建对象时常用的设计模式
转自:http://www.cnblogs.com/shouce/p/5488101.html 一.工厂模式 function person (name,age) { var p=new Object ...
- MyBatis的SQL语句映射文件详解(二)----增删改查
1.select语句 public List<User> findUser() { // TODO Auto-generated method stub List users= ( ...
- python+msf 制作 windows远控
最近分析的一个远控,后发现是meterpreter rever http shell,文件是个打包的python(打包成exe),感谢wstone的指导~ 创建dll ./msfpayload win ...
- C++异常~二 转
Linux 下 C++ 异常处理技巧 处理固有语言局限性的四种技术 处理 C++ 中的异常会在语言级别上遇到少许隐含限制,但在某些情况下,您可以绕过它们.学习各种利用异常的方法,您就可以生产更可靠的应 ...
- linux基础之nginx和nfs服务
第一部分: 一.nginx服务安装nginx包(源码安装)1.先cd /etc/yum.repos.d目录下2.yum install epel-release -y(安装扩展包)3.yum in ...