洛谷 P1197 星球大战 题解
2024-09-02 03:37:02
并查集处理问题的基本思路:如果不是强制在线那么可以倒着处理,把删边改为可爱的加边,然后使用并查集来判断是否联通;
所以可以较为轻松的写出AC代码:
#include <bits/stdc++.h>
using namespace std;
int n,m;
int f[];
struct littlestar{
int to;
int nxt;
}star[];
int head[],cnt;
inline void add(int u,int v)
{
star[++cnt].to=v;
star[cnt].nxt=head[u];
head[u]=cnt;
}
int ask[];
inline int zhaobaba(int x)
{
if(f[x]==x){
return x;
}
return f[x]=zhaobaba(f[x]);
}
int bo[];
int vis[];
int lala[];
int main()
{
cin>>n>>m;
for(register int i=;i<=n;i++){
f[i]=i;
}
for(register int i=;i<=m;i++){
int u,v;
scanf("%d%d",&u,&v);
add(u,v);
add(v,u);
}
int k;
cin>>k;
for(register int i=;i<=k;i++){
scanf("%d",&ask[i]);
bo[ask[i]]=;
}
int ans=n-k;
for(register int u=;u<=n;u++){
if(bo[u]) continue;
else{
for(register int i=head[u];i;i=star[i].nxt){
int v=star[i].to;
if(bo[v]) continue;
int fx=zhaobaba(u);
int fy=zhaobaba(v);
if(fx!=fy){
f[fy]=fx;
--ans;
}
}
}
}
for(register int u=k;u>=;u--){
lala[u+]=ans;
++ans;
bo[ask[u]]=;
for(register int i=head[ask[u]];i;i=star[i].nxt){
int v=star[i].to;
if(bo[v]) continue;
int fx=zhaobaba(ask[u]);
int fy=zhaobaba(v);
if(fx!=fy){
f[fy]=fx;
if(!vis[fy]){
--ans;
vis[fy]=;
}
}
}
}
lala[]=ans;
for(register int i=;i<=k+;i++){
printf("%d\n",lala[i]);
}
}
最新文章
- Java学习之反射机制及应用场景
- Nodejs实现简单的反向代理
- 组合模式/composite模式/对象结构型模式
- spring注解配置实例
- HTML知识点01
- SU Demos-07NMO
- Haproxy+asp.net +RedisSessionStateProvider 完美实现负载均衡,并且session保持
- Android 添加Button事件
- 【Java基础】Java类及成员和修饰符的关系
- 怎样创建TWaver 3D的轮廓选中效果
- 一个强大的LogParser的UI工具--logparserlizard简介(开源IIS日志分析工具)
- hdu 1205
- Jquery与DOM对象
- (转)WCF中调用WebService出错,大家帮忙看看,回答就有分
- WPF 3D:使用变换中的TranslateTransform3D
- List subList()的一个demo
- 微信小程序的动画效果
- Redis集群分布
- 【Android Studio安装部署系列】四、Android SDK目录和作用分析
- Tomcat安装教程