洛谷P1197 星球大战
题目描述
很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治着整个星系。
某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球。这些星球通过特殊的以太隧道互相直接或间接地连接。
但好景不长,很快帝国又重新造出了他的超级武器。凭借这超级武器的力量,帝国开始有计划地摧毁反抗军占领的星球。由于星球的不断被摧毁,两个星球之间的通讯通道也开始不可靠起来。
现在,反抗军首领交给你一个任务:给出原来两个星球之间的以太隧道连通情况以及帝国打击的星球顺序,以尽量快的速度求出每一次打击之后反抗军占据的星球的连通块的个数。(如果两个星球可以通过现存的以太通道直接或间接地连通,则这两个星球在同一个连通块中)。
输入格式
输入文件第一行包含两个整数,n,mn,m,分别表示星球的数目和以太隧道的数目。星球用 0 \sim n-10∼n−1 的整数编号。
接下来的 mm 行,每行包括两个整数 x,yx,y,表示星球 xx 和星球 yy 之间有 “以太” 隧道,可以直接通讯。
接下来的一行为一个整数 kk ,表示将遭受攻击的星球的数目。
接下来的 kk 行,每行有一个整数,按照顺序列出了帝国军的攻击目标。这 kk 个数互不相同,且都在 00 到 n-1n−1 的范围内。
输出格式
第一行是开始时星球的连通块个数。接下来的 kk 行,每行一个整数,表示经过该次打击后现存星球的连通块个数。
输入输出样例
输入 #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
说明/提示
【数据范围】
对于 100\%100% 的数据,1\le m \le 2\times 10^51≤m≤2×105,1\le n \le 2m1≤n≤2m,x \neq yx=y。
上代码:
#include<iostream>
#include<cstdio>
#define f(i,a,b) for(register int i=a;i<=b;i++)
#define fd(i,a,b) for(register int i=a;i>=b;i--)
using namespace std;
int k,n,m,head[400002],tot,broken[400002],ans[400003];
int father[400003];
struct Node
{int next,node,from;
}h[400002];
inline void Add_Node(int u,int v)
{h[++tot].from=u;h[tot].next=head[u];head[u]=tot;h[tot].node=v;
}
bool Broken[400001];
inline int Get_father(int x)
{if(father[x]==x) return x;return father[x]=Get_father(father[x]);//你爸爸的爸爸就是你的爸爸——反查理马特——并查集
}
inline void hb(int u,int v)
{u=Get_father(u),v=Get_father(v);if(u!=v) father[v]=u;
}
int main()
{ios::sync_with_stdio(false);cin>>n>>m;f(i,0,n)father[i]=i,head[i]=-1;//并查集初始化 f(i,1,m){int x,y;cin>>x>>y;Add_Node(x,y);//储存图 Add_Node(y,x);//由于无向图存两遍 }cin>>k;f(i,1,k){cin>>broken[i];Broken[broken[i]]=1;//标记砸坏了 }int total=n-k;//初始化为所有点都是单独存在的 f(i,1,2*m)//有2*m个边 if(!Broken[h[i].from] && !Broken[h[i].node] && Get_father(h[i].from)!=Get_father(h[i].node)){//要是起点和终点都没砸坏 而且他们并没有联通total--;//连一条边 减一个联通体 hb(h[i].from,h[i].node);}ans[k+1]=total;//当前就是最后一次破坏后的个数 fd(i,k,1){//total=0 //这里不需要初始化 需要从上一次的废墟上修建 total++;//修复一个点 联通体+1 Broken[broken[i]]=0;//修复 for(int j=head[broken[i]];j!=-1;j=h[j].next)//枚举每一个子点 {if(!Broken[h[j].node] && Get_father(broken[i])!=Get_father(h[j].node)){total--;//连一边减一个联通块 hb(broken[i],h[j].node);//合并这两个点 }}ans[i]=total;}f(i,1,k+1) cout<<ans[i]<<endl;return 0;
}
洛谷P1197 星球大战相关推荐
- 洛谷 p1197 [JSOI2008]星球大战(并查集)
洛谷 P1197 [JSOI2008]星球大战 题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了 ...
- 洛谷 P1197 [JSOI2008]星球大战
题意简述 有n个点和m条通道, 现在按顺序破坏k个点 求每一次破坏后联通块的个数 题解思路 并查集,逆序做, 先假设给的k个星球全都被炸,求出此时的联通块个数,就是经过k次打击的联通块个数. 然后每次 ...
- 洛谷1197星球大战
题目描述 很久以前,在一个遥远的星系,一个黑暗的帝国靠着它的超级武器统治者整个星系.某一天,凭着一个偶然的机遇,一支反抗军摧毁了帝国的超级武器,并攻下了星系中几乎所有的星球.这些星球通过特殊的以太隧道 ...
- 洛谷 - 试炼场(全部题目备份)
整理的算法模板合集: ACM模板 目录 1.新手村 1 - 1 洛谷的第一个任务 1 - 2 顺序与分支 1 - 3 循环!循环!循环! 1 - 4 数组 1 - 5 简单字符串 1 - 6 过程函数 ...
- 洛谷-题解 P2672 【推销员】
独门思路!链表加优先队列! 这题一望,贪心是跑不掉了,但是我贪心并不好,所以想到了一个复杂一些但思路更保稳的做法 思路: 1 因为是离线操作,所以我们可以倒着求,先求x=n的情况,因为那样直接就知道了 ...
- 洛谷 P1142 轰炸
洛谷 P1142 轰炸 题目描述 "我该怎么办?"飞行员klux向你求助. 事实上,klux面对的是一个很简单的问题,但是他实在太菜了. klux要想轰炸某个区域内的一些地方,它们 ...
- 洛谷 P1387 最大正方形
P1387 最大正方形 题目描述 在一个n*m的只包含0和1的矩阵里找出一个不包含0的最大正方形,输出边长. 输入输出格式 输入格式: 输入文件第一行为两个整数n,m(1<=n,m<=10 ...
- 洛谷P2763 试题库问题
题目:https://www.luogu.org/problemnew/show/P2763 题目描述 «问题描述: 假设一个试题库中有n道试题.每道试题都标明了所属类别.同一道题可能有多个类别属性. ...
- 动态规划——洛谷_P1057传球游戏
题目: 题目描述 上体育课的时候,小蛮的老师经常带着同学们一起做游戏.这次,老师带着同学们一起做传球游戏.游戏规则是这样的:n个同学站成一个圆圈,其中的一个同学手里拿着一个球,当老师吹哨子时开始传球, ...
最新文章
- mysql 错误:1166 解决办法
- 用ASP实现在线压缩与解压缩
- Leetcode(20210412-20210418 第一周 每日一题)
- python查询数据库,打印查询结果过程中出现'NoneType' object is unsubscriptable
- OpenCASCADE:形状愈合之通用拆分工具
- C++求LCM的和算法(附完整源码)
- 阿里云监控插件安装 | 非阿里云服务器安装指南
- junit mockito_JUnit和Mockito合作
- 企业如何开展数据可视化建设
- Maven默认的生命周期
- GJB150.10A-2009霉菌试验标准费用-霉菌试验GJBA检测机构
- [常用]MySQL管理工具和应用程序
- id门禁卡复制到手机_手机NFC也可以刷ID卡门禁?无聊测试居然成功了!
- Volatility3内存取证工具使用详解
- 封装一个简单实用的朋友圈
- 计算机无法分盘,电脑如何分盘
- 赏析角度有哪些_从“视听语言”角度,主要从哪些方面进行影视赏析(? ?)。...
- Zmeet云雾架构-融合AI能力的通讯层的变革,性能远超传统通讯技术
- 华为芯片与器件设计工程师_华为芯片与器件设计工程师(实习)一、二面
- 作用域和改变this指向