题目:P1197 [JSOI2008]星球大战

并查集 - 图论 - 连通块

题目大意

给出一个 n n n 个点, m m m 条边的无向图,并告诉你 k k k 个攻击目标的编号
敌人依次攻击这 k k k 个点,求对于每次攻击后,图被分成了多少个连通块

首先,因为并查集不资瓷分裂操作,我们要考虑倒着做

先用并查集维护出 k k k 个点都摧毁后,图的连通情况

然后,从最后一个被攻击的点开始,我们实行一个修复操作:把这个刚被修复的点与其他 已经修好(或没被攻击过)的点 连边,并用并查集维护连通情况
在修复完每个被攻击的点后,将连通块个数存起来,最后倒序输出

注意:第一行要输出刚开始图的连通块个数

#include<cstdio>
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
const int Maxn=400000+20,inf=0x3f3f3f3f;
vector <int> e[Maxn];
stack <int> s;
int n,m,k,cur;
int f[Maxn],a[Maxn];
bool vis[Maxn];
inline int read()
{int s=0,w=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')w=-1;ch=getchar();}while(ch>='0' && ch<='9')s=(s<<3)+(s<<1)+(ch^48),ch=getchar();return s*w;
}
int find(int x)
{if(f[x]==x)return x;return f[x]=find(f[x]);
}
int main()
{//freopen("in.txt","r",stdin);n=read(),m=read();for(int i=1;i<=n;++i)f[i]=i;for(int i=1;i<=m;++i){int x=read(),y=read();x++,y++;e[x].push_back(y);e[y].push_back(x);}k=read();for(int i=1;i<=k;++i){a[i]=read();a[i]++;vis[a[i]]=1; //vis[i] = 1,表示城市 i 当前为稀巴烂(未修复)的状态,反之亦然}// 维护 k 个点都被摧毁时的状态for(int i=1;i<=n;++i){int x=i;if(vis[x])continue;for(int j=0;j<e[i].size();++j){int y=e[i][j];if(vis[y])continue;f[find(x)]=find(y);}}for(int i=1;i<=n;++i)if(f[i]==i && !vis[i])++cur;s.push(cur);for(int i=k;i>0;--i){// 开始修复vis[a[i]]=0;int x=a[i];cur++;for(int j=0;j<e[x].size();++j){int y=e[x][j];if(vis[x] || vis[y] || find(x)==find(y))continue;f[find(x)]=find(y);--cur;}s.push(cur);  //利用栈的先进后出,实现倒序}while(s.size()){printf("%d\n",s.top());s.pop();}return 0;
}

P1197 [JSOI2008]星球大战 题解相关推荐

  1. 洛谷 p1197 [JSOI2008]星球大战(并查集)

    洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...

  2. 洛谷 P1197 [JSOI2008]星球大战

    题意简述 有n个点和m条通道, 现在按顺序破坏k个点 求每一次破坏后联通块的个数 题解思路 并查集,逆序做, 先假设给的k个星球全都被炸,求出此时的联通块个数,就是经过k次打击的联通块个数. 然后每次 ...

  3. Luogu P1197 [JSOI2008]星球大战

    经巨佬们指教,得知要用:逆向思维法(这个一定要想到啊QwQwQ) 之后想了想,发现我大致思路跟第一篇题解比较像(后来AC代码的细节不一样,我是在每次'恢复'循环开始时计数的,题解是循环末尾,大同小异吧 ...

  4. 2019.7.14 并查集P1197 [JSOI2008]星球大战 说能过那是假的(动态规划) cometoj #c6 双倍快乐

    星球大战 这题是使用了一个total变量持续记录连通块数目,极大减少了判断时间 一开始我直接用从0到n-1遍历找连通块,这样绝对超时 通过代码如下 #include<bits/stdc++.h& ...

  5. P1197 [JSOI2008]星球大战~写题笔记

    题目:https://www.luogu.org/problemnew/show/P1197 #include<iostream> #include<algorithm> #i ...

  6. P1197 [JSOI2008]星球大战

    并查集维护集合 这道题code写起来很容易 但有很多启示 这道题需要逆序做 为什么呢? 对于路径压缩的并查集来说,如果合并了.那么想要在分开是很难的. 而且这道题要求每步输出.但是!! 这道题是先给操 ...

  7. 【反向并查集、联通图】P1197 [JSOI2008]星球大战

    题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ...

  8. bzoj 1015: [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 6230  Solved: 2909 [Subm ...

  9. BZOJ1015 [JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MB Submit: 3895  Solved: 1750 [Subm ...

最新文章

  1. 刚刚,百度宣布王海峰升任CTO
  2. 【推荐】由浅入深学FI—获利能力分析
  3. 安装博图v15每次让重启计算机,博途V15.1安装及无限重启和.net3.5SP1错误处理解决方法...
  4. Spring期末试题
  5. php网站建设实训引言_网站建设实训报告
  6. Shiro系列-Shiro中Realm如何使用
  7. 2017.3.3 双栈排序 失败总结
  8. 【Spring 工厂】工厂设计模式、第一个Spring程序细节分析、整合日志框架
  9. 没来得及整理的一些网站
  10. 《ANSYS Workbench 14有限元分析自学手册》——1.3 ANSYS 14的界面
  11. MySQL自动生成Oracle建表语句脚本
  12. 小程序打通了用户到店的最后一步!
  13. win7计算机怎么初始化,win7怎么初始化电脑 win7初始化电脑步骤
  14. Linux_+_Oracle_11g_R2_RAC_安装配置详细过程
  15. 用字符数组输出平行四边形
  16. 人人商城提示“app被您禁用啦,可以访问lbsyun.baidu.com/apiconsole/key#”
  17. 宏基aspire拆机触摸_Acer宏碁(Acer宏碁)Acer S5-371-76GS超极本拆解图评测-ZOL中关村在线...
  18. 多少人败给了一个字:等 ! 宋丹丹、梁静茹、张国荣。。。
  19. 在一个子组件中调用另一个子组件的方法
  20. 麦卡锡问答:什么是人工智能?

热门文章

  1. 腾讯安全亮相服贸会金融服务专题展,多项安全能力助力金融行业数字化转型
  2. 安全合规/GDPR--20--GDPR中处理活动的记录和特殊情形下的克减
  3. 你真的懂 Unicode 和 UTF-8 是什么关系吗?来看看这个就彻底懂了!
  4. 30分钟带你入门Oracle
  5. openGauss数据库性能调优概述及实例分析
  6. TortoiseSVN Client使用说明
  7. 丁卓雅计算机学院,2018届优秀毕业生汇总表.PDF
  8. 应用系统之间数据传输的几种方案
  9. C/C++判断文件/文件夹的状态:文件存在与否、读权限、写权限、执行权限
  10. 生成PL设备树及动态加载PL程序和设备树