【JSOI2008】星球大战 (并查集)
题面
Description
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
Input
第一行包含两个整数N (2 ≤ N ≤ 2M)和M (1 ≤ M ≤ 200,000),分别表示星球的数目和“以太”隧道的数目。星球用0到N – 1的整数编号。
接下来的M行,每行包含两个整数X和Y (0 ≤ X ≠ Y < N),表示星球X和星球Y之间有“以太”隧道,可以直接通讯。
接下来的一行包含一个整数K,表示将遭受攻击的星球的数目。
接下来的K行,每行一个整数,按照顺序列出了帝国军的攻击目标。这K个数互不相同,且都在0到N – 1的范围内。
Output
第一行是开始时星球的连通块个数。接下来的N行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
Sample Input
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
Sample Output
1
1
1
2
3
3
题解
考虑正向来做的话,很显然,无法维护联通快,只能够每一次重新来做一遍并查集(因为你要拆边)
但是,反着来看这道题,每次恢复一个点,这样就可以并查集来搞了。
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
#define MAX 1000000
inline int read()
{
      register int x=0,t=1;
      register char ch=getchar();
      while((ch<'0'||ch>'9')&&ch!='-')ch=getchar();
      if(ch=='-'){t=-1;ch=getchar();}
      while(ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
      return x*t;
}
struct Line
{
    int v,next;
}e[MAX];
int h[MAX],cnt=1,A[MAX];
int f[MAX],tt[MAX];
bool killed[MAX];
int N,M,KK,Ans;
inline void Add(int u,int v)
{
    e[cnt]=(Line){v,h[u]};
    h[u]=cnt++;
}
int getf(int x)
{
    return x==f[x]?x:f[x]=getf(f[x]);
}
int main()
{
      N=read();M=read();
      for(int i=1;i<=M;++i)
      {
          int u=read()+1,v=read()+1;
          Add(u,v);Add(v,u);
      }
      KK=read();
      for(int i=1;i<=KK;++i)
      {
            tt[i]=read()+1;
            killed[tt[i]]=true;
      }
      for(int i=1;i<=N;++i)f[i]=i;
      for(int i=1;i<=N;++i)
      {
            if(!killed[i])
            {
                  for(int j=h[i];j;j=e[j].next)
                  {
                      if(!killed[e[j].v])
                        f[getf(i)]=getf(e[j].v);
                  }
            }
      }
      for(int i=1;i<=N;++i)if(f[i]==i&&!killed[i])++Ans;
      A[KK+1]=Ans;
      for(int i=KK;i;--i)
      {
             killed[tt[i]]=false;Ans++;
             for(int j=h[tt[i]];j;j=e[j].next)
             {
                    if(killed[e[j].v])continue;
                    int x=getf(e[j].v),y=getf(tt[i]);
                    if(x==y)continue;
                    else
                    {
                            f[x]=y;
                            --Ans;
                    }
             }
             A[i]=Ans;
      }
      for(int i=1;i<=KK+1;++i)
            printf("%d\n",A[i]);
      return 0;
}
【JSOI2008】星球大战 (并查集)的更多相关文章
- 洛谷P1197 [JSOI2008] 星球大战 [并查集]
		题目传送门 星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这 ... 
- JSOI2008 星球大战 [并查集]
		题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ... 
- P1197 [JSOI2008]星球大战[并查集+图论]
		题目来源:洛谷 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球 ... 
- P1197 [JSOI2008]星球大战  并查集 反向
		题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ... 
- [bzoj1015][JSOI2008]星球大战——并查集+离线处理
		题解 给定一张图,支持删点和询问连通块个数 按操作顺序处理的话要在删除点的同时维护图的形态(即图具体的连边情况),这是几乎不可做的 我们发现,这道题可以先读入操作,把没删的点的边先连上,然后再倒序处理 ... 
- 洛谷 P1197 [JSOI2008]星球大战——并查集
		先上一波题目 https://www.luogu.org/problem/P1197 很明显删除的操作并不好处理 那么我们可以考虑把删边变成加边 只需要一波时间倒流就可以解决拉 储存删边顺序倒过来加边 ... 
- BZOJ_1015_星球大战_[JSOI2008]_(并查集)
		描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1015 n 个点,被 m 条边相连.进行k次删点操作,问第一次操作前和每次操作后的集合数(直接或 ... 
- 【BZOJ1015】【JSOI2008】星球大战 并查集
		题目大意 给你一张\(n\)个点\(m\)条边的无向图,有\(q\)次操作,每次删掉一个点以及和这个点相邻的边,求最开始和每次删完点后的连通块个数. \(q\leq n\leq 400000,m\le ... 
- 【JSOI2008】星球大战  并查集
		题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系. 某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧 ... 
- BZOJ-1015  StarWar星球大战   并查集+离线处理
		1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Submit: 4105 Solved: 1826 [Submit ... 
随机推荐
- centos7安装部署gitlab服务器
			[gitlab需要内存至少4GB] 我这里使用的是centos 7 64bit,我试过centos 6也是可以的! 1. 安装依赖软件 yum -y install policycoreutils ... 
- css设置兼容的透明样式
			css设置透明并实现兼容: <style>div{ filter: alpha(opacity=80); -moz-opacity: 0.8; -khtml-opacity: 0.8; o ... 
- bzoj[1835][ZJOI2010]base 基地选址
			bzoj[1835][ZJOI2010]base 基地选址 标签: 线段树 DP 题目链接 题解 这个暴力DP的话应该很容易看出来. dp[i][j]表示造了i个通讯站,并且j是第i个的最小费用. \ ... 
- 案例分析——BAT业务https化经历
			一.前言 通常的http访问会遭到中间人攻击.网络嗅探等普通用户感知不到的恶意行为,这些行为会篡改用户浏览页面引导用户访问非法网站.抓取用户的上网行为以及个人信息.严重的会造成用户 ... 
- SDP(7):Cassandra- Cassandra-Engine:Streaming
			akka在alpakka工具包里提供了对cassandra数据库的streaming功能.简单来讲就是用一个CQL-statement读取cassandra数据并产生akka-stream的Sourc ... 
- 使用Netbeans内置的Git工具
			在 NetBeans IDE 中使用 Git 支持 NetBeans IDE 为 Git 版本控制客户端提供支持.通过利用 IDE 的 Git 支持,您可以从 IDE 内的项目中直接执行版本控制任务. ... 
- SIFT解析(一)建立高斯金字塔
			SIFT(Scale-Invariant Feature Transform,尺度不变特征转换)在目标识别.图像配准领域具有广泛的应用,下面按照SIFT特征的算法流程对其进行简要介绍对SIFT特征做简 ... 
- 关于 Java 面试,你应该准备这些知识点
			来源:占小狼, www.jianshu.com/p/1b2f63a45476 马老师说过,员工的离职原因很多,只有两点最真实: 钱,没给到位 心,受委屈了 当然,我是想换个平台,换个方向,想清楚为什么 ... 
- 将vue的项目打包后通过百度的BAE发布到网上的流程
			经过两天的研究终于将VUE打包后的项目通过BAE发布到了网上.虽然接口方面还有一下问题但是自己还是很高兴的. 首先说一下这个项目需要用到的技术,vue+express+git+百度的应用引擎BAE. ... 
- Caffe可视化之VisualDL
			Visual DL是由 PaddlePaddle 和 ECharts 合作推出的一款深度学习可视化工具,其能够可视化scalar.参数分布.模型结构.图像等.底层采用C++编写,上层SDK以pytho ... 
