博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
bzoj1015:[JSOI2008]星球大战starwar
阅读量:5313 次
发布时间:2019-06-14

本文共 1282 字,大约阅读时间需要 4 分钟。

思路:反着做用并查集维护连通块个数就好了。

#include
#include
#include
#include
#include
using namespace std;#define maxn 400005int n,m,tot,k,num;int now[maxn],pre[maxn],son[maxn],deg[maxn],fa[maxn],ans[maxn];bool vis[maxn];inline int read(){ int x=0;char ch=getchar(); for (;ch<'0'||ch>'9';ch=getchar()); for (;ch>='0'&&ch<='9';ch=getchar()) x=x*10+ch-'0'; return x;}void add(int a,int b){ son[++tot]=b; pre[tot]=now[a]; now[a]=tot;}void link(int a,int b){ add(a,b),add(b,a);}int find(int x){return fa[x]==x?x:fa[x]=find(fa[x]);}int main(){ n=read(),m=read(); for (int i=1;i<=n;i++) fa[i]=i; for (int i=1,a,b;i<=m;i++) a=read(),b=read(),link(a+1,b+1); k=read(); for (int i=1;i<=k;i++) deg[i]=read(),vis[++deg[i]]=1; for (int i=1;i<=n;i++) if (!vis[i]){ num++; for (int p=now[i];p;p=pre[p]) if (!vis[son[p]]){ int u=find(i),v=find(son[p]); if (u!=v) fa[u]=v,num--; } } ans[k+1]=num; for (int i=k;i;i--){ num++; for (int p=now[deg[i]];p;p=pre[p]) if (!vis[son[p]]){ int u=find(deg[i]),v=find(son[p]); if (u!=v) fa[u]=v,num--; } ans[i]=num,vis[deg[i]]=0; } for (int i=1;i<=k+1;i++) printf("%d\n",ans[i]); return 0;}

 

转载于:https://www.cnblogs.com/DUXT/p/6013390.html

你可能感兴趣的文章
内存地址对齐
查看>>
看门狗 (监控芯片)
查看>>
css背景样式
查看>>
JavaScript介绍
查看>>
开源网络漏洞扫描软件
查看>>
yum 命令跳过特定(指定)软件包升级方法
查看>>
创新课程管理系统数据库设计心得
查看>>
Hallo wolrd!
查看>>
16下学期进度条2
查看>>
Could not resolve view with name '***' in servlet with name 'dispatcher'
查看>>
Chapter 3 Phenomenon——12
查看>>
和小哥哥一起刷洛谷(1)
查看>>
遇麻烦,Win7+Ubuntu12.10+Archlinux12.10 +grub
查看>>
SqlBulkCopy大批量导入数据
查看>>
pandas 修改指定列中所有内容
查看>>
「 Luogu P2285 」打鼹鼠
查看>>
lua语言入门之Sublime Text设置lua的Build System
查看>>
vue.js基础
查看>>
电脑的自带图标的显示
查看>>
[转载] redis 的两种持久化方式及原理
查看>>