洛谷 1197 星球大战 并查集 解题报告
来源:互联网 发布:什么牌子沙发好 知乎 编辑:程序博客网 时间:2024/06/05 00:08
题目描述
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。
但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
输入输出格式
输入格式:
输入文件第一行包含两个整数,N (1 <= N <= 2M) 和M (1 <= M <= 200,000),分别表示星球的数目和以太隧道的数目。星球用0~N-1的整数编号。
接下来的M行,每行包括两个整数X, Y,其中(0<=X<>Y
输出格式:
输出文件的第一行是开始时星球的连通块个数。
接下来的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
说明
[JSOI2008]
思路
很明显,让我们求联通块的话,不是并查集就是Tarjan。分析一下得出这道题是并查集
记录每一个时刻摧毁的点,把它们加起来,加一个就记录联通块个数,然后中间遍历可以联通的连上。
最后把答案数组反着输出就好了。
然而我并不是1A。。
原因有几点:一个是我的0、1判断反了(样例查出来的),然后就是数据范围理解错了。。。
然后就只开了100000的数组。果断RE。hhh。。。。
嗯。。不过啊。。。
要是联赛考场有这种题,我还是有信心过的
代码
#include<cstdio>#include<cstring>#include<algorithm>#include<iostream>#include<cmath>#include<vector>using namespace std;const int N=400000+5;int n,m,k,head[N],num=0,father[N],flag[N],tim[N],tot[N];struct edge{int u,v,next;}ed[N*2];void build(int u,int v){ ed[++num].u=u; ed[num].v=v; ed[num].next=head[u]; head[u]=num;}int getfather(int x){ if (x==father[x]) return x; return father[x]=getfather(father[x]);}int main(){ memset(flag,0,sizeof(flag)); memset(head,-1,sizeof(head)); scanf("%d%d",&n,&m); for (int i=1;i<=m;i++) { int u,v; scanf("%d%d",&u,&v); build(u,v); build(v,u); } scanf("%d",&k); for (int i=1;i<=k;i++) { int x; scanf("%d",&x); flag[x]=1;tim[i]=x; } for (int i=0;i<=n;i++) father[i]=i; int blk=n-k,top=0; for (int i=1;i<=num;i++) { int u=ed[i].u,v=ed[i].v; if (flag[u]==0&&flag[v]==0&&getfather(u)!=getfather(v)) { blk--; father[getfather(u)]=getfather(v); } } tot[++top]=blk; for (int i=k;i>=1;i--) { int u=tim[i]; blk++;flag[u]=0; for (int j=head[u];j!=-1;j=ed[j].next) { int v=ed[j].v; if (flag[v]==0&&getfather(u)!=getfather(v)) { blk--; father[getfather(u)]=getfather(v); } } tot[++top]=blk; } for (int i=top;i>=1;i--) printf("%d\n",tot[i]); return 0;} /*8 130 11 66 55 00 61 22 33 44 57 17 27 63 6516357*/
- 洛谷 1197 星球大战 并查集 解题报告
- 洛谷 1197 [JSOI2008]星球大战 并查集
- 洛谷 并查集 星球大战.
- 并查集解题报告
- BZOJ[1015]洛谷[1197]星球大战 并查集
- <并查集>luogu 1197 星球大战
- 【BZOJ1015】星球大战 并查集
- 星球大战 JSOI2008 并查集
- 洛谷 2814 家谱 并查集 解题报告
- 食物链 并查集 解题报告
- HDU 1232 - 并查集 解题报告
- Friend解题报告 - 并查集练习
- 并查集专题训练解题报告
- BZOJ 2054 并查集 解题报告
- BZOJ 3319 并查集 解题报告
- POJ 1182 并查集 解题报告
- HDU1213并查集解题报告
- 洛谷P1197 [JSOI2008]星球大战(并查集)
- X11简介及Xlib参考手册地址
- ZOJ 3993 Safest Buildings(概率 数学)
- SQL Server2008 学习之(一) :入门知识
- 多线程
- python发送带附件邮件
- 洛谷 1197 星球大战 并查集 解题报告
- 大数据Web工具Hue
- 信息学奥赛一本通(C++版) 第二部分 基础算法 第九章 动态规划
- Python学习(一)
- tf-Time travel时间穿梭
- C/C++动态内存管理
- D
- 数组排序之后相邻数的最大差值
- java中的堆和栈的解释,不错的非常详细