题目https://www.luogu.org/problemnew/show/P1197

题意:有n个结点m条无向边,k次操作每次摧毁一个结点并询问此时有多少连通块。

思路:平时在线的搞多了都没想到这道题完全可以存下结果之后输出。

对于那些要被摧毁的城市,我们只需要先都摧毁,然后倒序的进行恢复。就可以求出每一次操作的结果了。

因为对于摧毁我们不好用并查集,但是对于重建就比较好用并查集了。

所以分成两步,把所有没有被摧毁的连通的结点都合并起来。

然后按照倒序加入被摧毁的结点,将他和他所邻接的结点进行合并。

 #include<cstdio>
#include<cstdlib>
#include<map>
#include<set>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>
#include<stack>
#include<queue>
#include<iostream> #define inf 0x7fffffff
using namespace std;
typedef long long LL;
typedef pair<string, string> pr; int n, m, k;
const int maxn = 4e5 + ;
int par[maxn];
int head[maxn];
struct edge{
int u, v, nxt;
}e[maxn];
int tot = ;
bool destroy[maxn]; void addedge(int u, int v)
{
e[tot].u = u;
e[tot].v = v;
e[tot].nxt = head[u];
head[u] = tot++;
e[tot].u = v;
e[tot].v = u;
e[tot].nxt = head[v];
head[v] = tot++;
} int ffind(int x)
{
if(par[x] == x)return x;
else return par[x] = ffind(par[x]);
} void init()
{
for(int i = ; i < n; i++){
par[i] = i;
head[i] = -;
destroy[i] = false;
}
} stack<int>sss;
stack<int>ans;
int main()
{
scanf("%d%d", &n, &m);
init();
for(int i = ; i < m; i++){
int u, v;
scanf("%d%d", &u, &v);
addedge(u, v);
}
scanf("%d", &k);
for(int i = ; i < k; i++){
int d;
scanf("%d", &d);
destroy[d] = true;
sss.push(d);
} int cnt = n - k;
for(int i = ; i < tot; i++){
if(!destroy[e[i].u] && !destroy[e[i].v]){
int fu = ffind(e[i].u), fv = ffind(e[i].v);
if(fu != fv){
cnt--;
par[fu] = fv;
}
}
}
ans.push(cnt);
while(!sss.empty()){
int x = sss.top();sss.pop();
cnt++;
destroy[x] = false;
for(int i = head[x]; i != -; i = e[i].nxt){
if(!destroy[e[i].u] && !destroy[e[i].v]){
int fu = ffind(e[i].u), fv = ffind(e[i].v);
if(fu != fv){
cnt--;
par[fu] = fv;
}
}
}
ans.push(cnt);
} while(!ans.empty()){
printf("%d\n", ans.top());
ans.pop();
} return ;
}

洛谷P1197 星球大战【并查集】的更多相关文章

  1. 洛谷P3295 萌萌哒 并查集 + ST表

    又切一道紫题!!! 成功的(看了一吨题解之后),我A掉了第二道紫题. 好,我们仔细观察,发现这是一个排列组合问题. 有些限定条件,要相等的地方,我们就用并查集并起来.最后一查有多少个并查集,就有多少个 ...

  2. 洛谷P4092树——并查集

    题目:https://www.luogu.org/problemnew/show/P4092 利用并查集,倒序离线,那么从倒序来看被撤销标记的点就再也不会被标记,所以用并查集跳过: 莫名其妙的WA,调 ...

  3. 洛谷P2391 白雪皑皑(并查集)

    题目背景 “柴门闻犬吠,风雪夜归人”,冬天,不期而至.千里冰封,万里雪飘.空中刮起了鸭毛大雪.雪花纷纷,降落人间. 美能量星球(pty 在 spore 上的一个殖民地)上的人们被这美景所震撼.但是 p ...

  4. 洛谷P3958 奶酪 并查集

    两个空洞可互达当且仅当两个空洞相切,即球心距离小于等于球的直径. 一一枚举两个可互达的空洞,并用并查集连起来即可. Code: #include<cstdio> #include<c ...

  5. 洛谷 P1197 星球大战 题解

    题面 并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通: 所以可以较为轻松的写出AC代码: #include <bits/stdc+ ...

  6. 洛谷 P3958 奶酪 并查集

    目录 题面 题目链接 题面 题目描述 输入输出格式 输入格式 输出格式: 输入输出样例 输入样例 输出样例 说明 思路 AC代码 总结 题面 题目链接 P3958 奶酪 题面 题目描述 现有一块大奶酪 ...

  7. 洛谷 P2391.白雪皑皑 (并查集,思维)

    题意:有\(n\)个点,对这些点进行\(m\)次染色,第\(i\)次染色会把区间\((i*p+q)\ mod\ N+1\)和\((i*q+p)\ mod\ N+1\)之间的点染成颜色\(i\),问最后 ...

  8. 洛谷P2024食物链——并查集补集的灵活运用

    题目:https://www.luogu.org/problemnew/show/P2024 自己在做本题时最大的障碍就是:不会在一个集合的father改变时把相应的补集也跟着改变. 借鉴题解后,才明 ...

  9. Bzoj1015/洛谷P1197 [JSOI2008]星球大战(并查集)

    题面 Bzoj 洛谷 题解 考虑离线做法,逆序处理,一个一个星球的加入.用并查集维护一下连通性就好了. 具体来说,先将被消灭的星球储存下来,先将没有被消灭的星球用并查集并在一起,这样做可以路径压缩,然 ...

随机推荐

  1. Ctrl+Tab

    很好用的快捷键. 可以在浏览器中自由切换,也可以在编辑器中自由切换.

  2. sql server 日期函数

    一.sql server日期时间函数Sql Server中的日期与时间函数 1.  当前系统日期.时间     select getdate()  2. dateadd  在向指定日期加上一段时间的基 ...

  3. 【C++札记】new和delete

    介绍 1.malloc,free和new,delete区别. a.malloc,free是C/C++的标准库函数.new,delete是c++的操作符. b.malloc申请的是内存,严格意义不是&q ...

  4. java中如何测试一段代码的运行时间

    一.以毫秒为单位.long startTime = System.currentTimeMillis(); //获取开始时间 doSomething(); //测试的代码段 long endTime ...

  5. 文件操作之打开文件与读写文件——C语言

    一.fopen 函数原型:FILE *fopen( const char *filename, const char *mode ); 返回值:返回值类型为FILE *,打开文件成功返回指向打开文件的 ...

  6. vue中设置全局的css样式

    只需在main.js    ====import './style.less'   main.js =>>   import Vue from 'vue' import App from ...

  7. uboot中打开 debug调试信息的方法

    在uboot目录下include/common.h中, 原理:只需要让 _DEBUG 的值为 1即可. 最简单的做法就是在下图第一行之前添加 #define DEBUG

  8. 怎样手写一个Object.create()方法

    Object.create()会将参数对象作为一个新创建的空对象的原型, 并返回这个空对象, 基于这个功能, 就有了下面这个Object.create()的手动实现: function _create ...

  9. js对象 c#对象转换

    前台页面 js 创建对象 let t = {}; 数组对象 let c = []; c.push({}) ;// 添加对象 以string格式 传递 JSON JSON.stringify(c); c ...

  10. 在.netcore webapi项目中使用后台任务工具Hangfire

    安装Hangfire 在webapi项目中通过nuget安装Hangfire.Core,Hangfire.SqlServer,Hangfire.AspNetCore,截止到目前的最新版本是1.7.6. ...