洛谷 P1197 [JSOI2008]星球大战

题目描述

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。

但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。

输入输出格式

输入格式:
输入文件第一行包含两个整数,N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。

接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y < N),表示星球X和星球Y之间有以太隧道。注意所有的以太隧道都是双向的。

接下来一行是一个整数K,表示帝国计划打击的星球个数。

接下来的K行每行一个整数X,满足0<=X< N,表示帝国计划打击的星球编号。帝国总是按输入的顺序依次摧毁星球的。

输出格式:
输出文件的第一行是开始时星球的连通块个数。

接下来的K行,每行一个整数,表示经过该次打击后现存星球的连通块个数。

输入输出样例

输入样例#1:

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
1
2
3
3

思路:对于每次摧毁一个城市,我们需要求出当前图的连通块个数,这显然会超时。所以我们可以倒过来处理,把被摧毁城市的顺序记录下来,从最后状态开始,每次摧毁一个城市改为建设一个城市,用并查集维护连通块个数,记录答案即可。

题解:

#include<iostream>
#include<cstdio>
#include<stack>
using namespace std;
const int maxn=400000+10;
struct cc{int from,to;
}es[maxn];
int first[maxn],nxt[maxn];
int tot=0;
void build(int ff,int tt)
{es[++tot]=(cc){ff,tt};nxt[tot]=first[ff];first[ff]=tot;
}
bool vis[maxn];
int f[maxn];
int s[maxn];
int find(int w)
{if(w!=f[w]){f[w]=find(f[w]);}return f[w];
}
stack<int>ss;//存答案
int main()
{int n,m;scanf("%d%d",&n,&m);for(int i=0;i<n;i++)//城市编号为0~n-1,坑死人。。 {f[i]=i;}for(int i=1;i<=m;i++){int x,y;scanf("%d%d",&x,&y);build(x,y);build(y,x);}int k;scanf("%d",&k);for(int i=1;i<=k;i++){scanf("%d",&s[i]);vis[s[i]]=1;//将被摧毁的城市标记为1 }int ans=n-k;for(int i=0;i<n;i++){if(!vis[i])//如果当前城市未被摧毁 {for(int j=first[i];j;j=nxt[j]){int u=es[j].to;if(!vis[u]&&find(i)!=find(u)){f[find(i)]=find(u);ans--;}}}}ss.push(ans);for(int i=k;i>=1;i--){vis[s[i]]=0;ans++;for(int j=first[s[i]];j;j=nxt[j]){int u=es[j].to;if(!vis[u]&&find(s[i])!=find(u)){f[find(s[i])]=find(u);ans--;}}ss.push(ans);}while(!ss.empty()){printf("%d\n",ss.top());ss.pop();}return 0;
}

转载于:https://www.cnblogs.com/-feather/p/7779870.html

洛谷 p1197 [JSOI2008]星球大战(并查集)相关推荐

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

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

  2. 【洛谷 P7299】 【并查集】 Dance Mooves S

    [洛谷 P7299] [并查集] Dance Mooves S 题目 解题思路 可以先求出k轮后i能到达next[i] 可以发现将会组成由很多个简单环组成的图,它们能到达的点可以共享给同一个环内的 所 ...

  3. [JSOI2008]星球大战 并查集

    这一阵子因为好多原因,学习时间有点少,还好时间不算很长. 这两天写了道并查集的题目,感觉不错. 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶 ...

  4. 洛谷 - P1111 - 修复公路 - 并查集

    https://www.luogu.org/problemnew/solution/P1111 并查集的水题,水题都错了好多发. 首先并不是有环就退出,而是连通分支为1才退出,每次合并成功连通分支才会 ...

  5. 洛谷 P1967货车运输 并查集+贪心 不需要用LCA!

    题目链接 题目链接 题解 要求所有的路径中最小边长的最大值! 我们贪心的加边,依照边从大往小的方式往里添加,然后合并并查集. 每次当查询分布在两个待合并的并查集的时候,当前的边长就是这次查询的答案. ...

  6. 洛谷P1551 亲戚(并查集)

    题目链接 思路: 并查集的模板题目 关于并查集相关知识可以看此博客 AC代码 #include<iostream> #include<cstdio> #include<a ...

  7. 每日一题——洛谷 P1551 亲戚 (并查集)

    大家好,我是爬行系,今天打卡并查集相关例题 文章目录 并查集 1.概念 2.模板 例题 1.题目描述 2.AC代码 更多练习题 总结 并查集 1.概念 并查集的思想是用一个数组表示了整片森林(pare ...

  8. 洛谷 - P4997 - 不围棋 - 并查集 - 模拟

    https://www.luogu.org/problemnew/show/P4997 首先是改变气的定义,使得容易计算,这个很好理解. 然后使用并查集,因为要维护整个连通块的性质. 最后的难点在于, ...

  9. bzoj1015 [JSOI2008]星球大战 并查集

    对于这种连续删边的问题,可以离线,这样就变成了加边,usaco有类似的题.. 码: #include<iostream> #include<cstdio> #include&l ...

最新文章

  1. php语言出现弹框 再提交怎么写,jquery/php和多语言确认/警报框
  2. NASA指定首批9名宇航员,参与波音和马斯克商业载人航天
  3. 使用Nexus搭建Maven私服
  4. android 市场自动安装软件,Android 应用中跳转到应用市场评分示例
  5. OO ALV 工具栏对于的功能码
  6. opencv图像处理9-图像金字塔
  7. zookeeper 学习笔记1(转)
  8. 烽火戏诸侯于计算机相关联系,烽火戏诸侯的成语典故
  9. HTTP Error: 413 Request Entity Too Large的解决
  10. 2019eclipse 中文汉化包 安装教程
  11. 高效办公软件推荐——屏幕录制类
  12. win7计算机锁频图片怎么设置,Win7系统怎么使用注册表设置锁屏壁纸的图文教程...
  13. 3dmax:3dmax三维建模中常用的渲染设置【明暗器基本参数】、Standard的材质、光线跟踪、合成、混合、建筑、无光/投影、混合实例 、多维子对象之详细攻略
  14. 队列——数据结构严蔚敏C语言版
  15. Creo二次开发 Creo4.0 Qt5 动态部署发布
  16. html dom 触发等事件
  17. 【汽车制造业】“新三化+新能源”蓝海,加速车企数字化转型进入“深水区”
  18. 怎么安装苹果系统mac os x虚拟机
  19. VS Code 空闲时的 CPU 使用率是 13%
  20. 有源代码就可以自行开发通达信交易接口了吗?

热门文章

  1. Spring Security Oauth2 (一) 整体流程介绍
  2. SQLAlchemy engine.Engine
  3. 编程语言对比 命名空间
  4. 3.5 向量化实现的解释
  5. Sphinx 文档例子
  6. 在线编程语言模拟(Java,C,Python,R语言,Ruby,PHP,Perl,Go等)
  7. CentOS7配置samba共享文件系统
  8. python 高级编程 豆瓣_python 的一些高级编程技巧
  9. VMware ESXi 环境备份与还原处理案例
  10. Exchange Server 2016 独立部署/共存部署 (三)—— 安装Exchange程序