星球之间互相直接或间接地连接
帝国开始使用死星有计划地摧毁反抗军占领的星球
给出星球间隧道的连通情况,已经帝国打击的顺序
要求以尽量快的速度求出每一次打击之后反抗军占据的星球的联通快的个数(若两个星球,直接或间接的通过现存的通道连接,则视为在一个联通块
输入格式:
第一行两个整数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的更多相关文章

  1. BZOJ1015 并查集

    1015: [JSOI2008]星球大战star war Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了 ...

  2. [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 ...

  3. 英语口语练习系列-C15-心情不好

    单词 1. artist [ˈɑ:tɪst] n. 艺术家 a great artist 一名伟大的艺术家 a Chinese artist 一名中国艺术家 2. beef [bi:f] n. 牛肉 ...

  4. 英语口语练习系列-C12-不了解

    词汇 air [eə(r)] n. 空气 fresh air 新鲜的空气 warm air 暖暖的空气 I like to air the room. 我喜欢给房间通气. on the air 正在播 ...

  5. elasticsearch 搜索提示DSL

    1,创建mapping: PUT /news_website { "mappings": { "news" : { "properties" ...

  6. [Udemy] ES 7 and Elastic Stack - part 2

    Section 3: Searching with Elasticsearch query with json 分页返回 Sort full text 的内容不能用来sort, 比如movie的 ti ...

  7. 科幻电影免费百度云分享(Scince-fiction cloud share)

    Marvel episode Link  Passcode:6h9k Star War full episode Link Passcode:7abk Men In Black Episode Col ...

  8. ElasticSearch 搜索模板与建议

    公号:码农充电站pro 主页:https://codeshellme.github.io Search APIs 用于搜索和聚合存储在 ES 中的数据. 1,搜索模板 Template Search ...

  9. 洛谷 P1197 BZOJ 1015 [JSOI2008]星球大战 (ZOJ 3261 Connections in Galaxy War)

    这两道题长得差不多,都有分裂集合的操作,都是先将所有操作离线,然后从最后一步开始倒着模拟,这样一来,分裂就变成合并,也就是从打击以后最终的零散状态,一步步合并,回到最开始所有星球都被连为一个整体的状态 ...

随机推荐

  1. hbase(0.94) get、scan源码分析

    简介 本文是需要用到hbase timestamp性质时研究源码所写.内容有一定侧重.且个人理解不算深入,如有错误请不吝指出. 如何看源码 hbase依赖很重,没有独立的client包.所以目前如果在 ...

  2. NAPT 分为锥型(Cone)和 对称型(Symmetric)

    NAPT 分为锥型(Cone)和 对称型(Symmetric) 链接:https://www.zhihu.com/question/38729355/answer/86531260 实际上大部运营商提 ...

  3. 【ZJ选讲·压缩】

    给一个由小写字母组成的字符串(len<=50) 我们可以用一种简单的方法来压缩其中的重复信息. 用M,R两个大写字母表示压缩信息 M标记重复串的开始, R表示后面的一段字符串重复从上一个 ...

  4. SCOI2010 传送带 [三分/模拟退火]

    题目描述 在一个2维平面上有两条传送带,每一条传送带可以看成是一条线段.两条传送带分别为线段AB和线段CD.lxhgww在AB上的移动速度为P,在CD上的移动速度为Q,在平面上的移动速度R.现在lxh ...

  5. MFC 对话框透明效果

    网上找的资料自己改了改,在这里记录和分享一下,主要是TransparentWnd函数. 在子类的OnShowWindow函数中调用 ShowWindowAlpha() #pragma once tem ...

  6. Python之json编码

    一.json JSON: JavaScript Object Notation(JavaScript 对象表示法) JSON 是存储和交换文本信息的语法 1.json轻量级:语法规则 JSON 语法是 ...

  7. VS2010 VC Project的default Include设置

    在IDE中,打开View->Other Windows->Property Manager.展开树形后,你会发现一个名为“Microsoft.Cpp.Win32.user”的项目(如下图) ...

  8. linux+GraphicsMagick 安装

    转摘自:http://blog.csdn.net/fhqsse220/article/details/12995763 GraphicsMagick 安装 下载软件:download:ftp://ft ...

  9. (转)Notepad++

    包括notepad++的详细的安装过程,插件使用说明,技巧…… crifan http://www.crifan.com/files/doc/docbook/rec_soft_npp/release/ ...

  10. [05] call by sharing || 共享参数

    转: https://segmentfault.com/a/1190000005177386 众所周知,JavaScript中参数是按值传递的.与访问变量不同,基本类型和引用类型的参数在传递时都如同变 ...