Description

很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系。某一天,凭着一个偶然的
机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直
接或间接地连接。 但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划
地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。现在,反抗军首
领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每
一次打击之后反抗军占据的星球的连通快的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则
这两个星球在同一个连通块中)。


Input

输入文件第一行包含两个整数,N (1  < =  N  < =  2M) 和M (1  < =  M  < =  200,000),分别表示星球的
数目和以太隧道的数目。星球用 0 ~ N-1的整数编号。接下来的M行,每行包括两个整数X, Y,其中(0 < = X <> 
Y 表示星球x和星球y之间有“以太”隧道,可以直接通讯。接下来的一行为一个整数k,表示将遭受攻击的星球的
数目。接下来的k行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这k个数互不相同,且都在0到n-1的范
围内。


Output

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


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


题解:

  显然一看就知道是并查集,但是需要不断删除点,然而并查集并不支持删除操作。而且路径压缩过后,每个点显然只与根节点有关系而找不到子节点与其他子节点的关系了,所以只能反过来做,先求出所有星球被炸完后的连通分量,再把被炸的星球一个一个加上去,维护连通分量个数即可。

  另外最后输出答案的时候用cout就runtime error??害得我查了一小时的bug...我真他娘服了

 #include <iostream>
#include <string.h>
#include <cstdio>
#include <algorithm>
#include <queue>
#pragma warning ( disable : 4996 ) #define sigma_size 26 using namespace std; const int inf = 0x3f3f3f3f;
const int vspot = 4e5 + ;
const int espot = 2e5 + ; struct node {
int to;
int next;
}e[vspot]; int N, M;
int cnt, linjie[vspot], pre[vspot], num;
int hit[vspot]; //hit[x]表示x号星球是否毁灭
int fin[vspot]; //fin记录被毁灭星球的顺序号数
int ans; int find( int x ) { return x==pre[x]?x:pre[x]=find(pre[x]); } void add( int x, int y )
{
e[cnt].to = y; e[cnt].next = linjie[x]; linjie[x] = cnt++;
e[cnt].to = x; e[cnt].next = linjie[y]; linjie[y] = cnt++;
} void init()
{
cnt = num = ;
ans = N;
memset( linjie, -, sizeof(linjie) );
for( int i = ; i <= N; i++ )
pre[i] = i;
} void read()
{
int x, y;
for ( int i = ; i < M; i++ )
{
scanf( "%d %d", &x, &y );
add( x, y );
} cin >> num;
for ( int i = ; i <= num; i++ )
{
scanf("%d", &x);
fin[i] = x;
hit[x] = ;
}
} void merge(int x)
{
int xr = find(x);
for ( int y = linjie[x]; y+; y = e[y].next )
if ( !hit[e[y].to] )
{
int yr = find(e[y].to);
if ( yr != xr )
{
pre[yr] = xr;
ans--;
}
}
} int main()
{
cin >> N >> M;
init();
read();
//先 画出图
for( int i = ; i < N; i++ )
{
if ( !hit[i] )
merge(i);
else
ans--; //一个星球被毁灭时,它本身就不算一个连通分量
}
fin[num+] = ans; //最后一个星球被毁灭后剩下的连通分量个数
//一个一个加点和加边
for ( int i = num; i > ; i-- )
{
hit[fin[i]] = ;
ans++; //将一个星球加回来时,相当于多了一个连通分量 merge(fin[i]);
fin[i] = ans;
}
////////////////用cout就会runtime error/////////////////////////
for( int i = ; i <= num+; i++ )
printf("%d\n",fin[i]); return ;
}

HYSBZ 1015/BZOJ1015 星球大战starwar的更多相关文章

  1. bzoj1015:1015: [JSOI2008]星球大战starwar

    应该是全部读入之后再添加边用并查集就可以了. yyl用空间换时间.u[]v[]等将边预存起来. #include<cstdio> #include<cstring> #incl ...

  2. 1015: [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec Memory Limit: 162 MB Description 很久以前,在一个遥远的星系,一个黑暗的帝国 ...

  3. [1015][JSOI2008]星球大战starwar(并查集)

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 2124  Solved: 909[Submit] ...

  4. BZOJ 1015: [JSOI2008]星球大战starwar 并查集

    1015: [JSOI2008]星球大战starwar Description 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝 ...

  5. 【BZOJ】1015: [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar 题意:一个点数为N(1<= 40w),边数为M(1<=20w)的图,总共删除k个节点,问开始以及每次删除一个节点之后图的连通块数? ...

  6. BZOJ 1015 [JSOI2008]星球大战starwar

    1015: [JSOI2008]星球大战starwar Time Limit: 3 Sec  Memory Limit: 162 MBSubmit: 3551  Solved: 1581[Submit ...

  7. 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 看了题解的囧T_T,一开始以为是求割点,但是想到割点不能统计.... 这题用并查集,思想很巧妙 ...

  8. bzoj 1015: [JSOI2008]星球大战starwar (逆向思维+并查集)

    链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1015 思路: 题目是要我们对当前图拆掉k个点,问,每拆一个点后图中有多少个联通块,我们可以逆 ...

  9. BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)

    http://www.lydsy.com/JudgeOnline/problem.php?id=1015 题意: 思路:好题啊!!! 这道题目需要离线处理,先把所有要删的点给保存下来,然后逆序加点,这 ...

随机推荐

  1. 9.1 mongo_python.py

    # 安装 pymongo pip install pymongo import pymongo try: # 1.链接mongod的服务 mongo_py = pymongo.MongoClient( ...

  2. 05_mybatis动态sql

    1.sql片段 1.sql片段**** mybatis核心 对sql语句进行灵活操作,通过表达式进行判断,对sql进行灵活拼接.组装. 2.需求 用户信息综合查询列表和用户信息查询列表总数这两个sta ...

  3. swagger请求参数在header中添加token

    网友大部分说的是如下配置 参照配置然而没有作用 注掉改红框内的配置,在方法上加如下注释就可以用 @ApiImplicitParams({ @ApiImplicitParam(paramType = & ...

  4. 动软DbHelperSQL

    using System; using System.Collections; using System.Data; using System.Data.SqlClient; using System ...

  5. [JZOJ4684] 【GDOI2017模拟8.11】卡牌游戏

    题目 描述 题目大意 有111到2n2n2n牌,一开始分别给两个人,每人nnn张. 轮流出牌,给出对手出牌的顺序,若自己的牌更大,就记一分. 在中间的某个时刻可以改变游戏规则. 问最大的分数. 思考历 ...

  6. python-爬免费ip并验证其可行性

    前言 最近在重新温习python基础-正则,感觉正则很强大,不过有点枯燥,想着,就去应用正则,找点有趣的事玩玩 00xx01---代理IP 有好多免费的ip,不过一个一个保存太难了,也不可能,还是用我 ...

  7. linux 详解

    一.日常使用命令/常用快捷键命令开关机命令        1.shutdown –h now:立刻进行关机 2.shutdown –r now:现在重新启动计算机 3.reboot:现在重新启动计算机 ...

  8. 第一周课堂笔记5th

    1.      While循环机制 如何终止循环? 改变条件(根据上面的流程,只要改变条件,就会终止循环). 关键字:break. 调用系统命令:quit(),exit() 后面会讲到,不建议大家使用 ...

  9. mysql表时间戳字段设置

    创建时间 修改时间  

  10. RTNETLINK answers: File exists错误解决方法

    >一.写在前面: 因为是我刚学习linux好多问题需要解决,bolg仅作为记录自己的在技术这条道路上的点点滴滴. 二.事件起因: 最近因为女友的原因消沉的好长时间,在马哥那里的课程的结束到现在已 ...