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

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

看到联通块,好像跟并查集、强连通分量有关系吧,仔细一看跟哪些点属于哪些块没关系,只关心联通块数量,那么应该可以用并查集做。继续看,这是一道删边的题,好像很难维护删边,我们又知道并查集是可以维护加边的,那么我们就倒过来做好了。

#include 
#include
#include
#define MAXN 400005struct Node{ int u,v;}E[MAXN];struct edge{ int v,next;}G[MAXN];int fa[MAXN],vis[MAXN];int ed[MAXN],ans[MAXN];int head[MAXN];int N,M,K,tot=0;int find(int x){ return x==fa[x]?x:fa[x]=find(fa[x]);}inline void merge(int u,int v){ fa[find(u)] = find(v);}inline void add(int u,int v){ G[++tot].v = v ;G[tot].next = head[u];head[u] = tot;}int main(){ scanf("%d%d",&N,&M); for(register int i=0;i
=1;--i){ scanf("%d",&ed[i]); vis[ed[i]] = 1; } for(register int i=1;i<=M;++i){ int u = E[i].u;int v = E[i].v; if(vis[u]||vis[v]||(find(u)==find(v)))continue; merge(u,v); count--; } ans[0] = count; for(register int i=1;i<=K;++i){ vis[ed[i]] = 0; count++; for(register int j=head[ed[i]];j;j=G[j].next){ int v = G[j].v; if(!vis[v]&&find(v)!=find(ed[i])){ merge(v,ed[i]); count--; } } ans[i] = count; } for(register int i=K;i>=0;--i){ printf("%d\n",ans[i]); } return 0;}

转载于:https://www.cnblogs.com/Neworld2002/p/9814046.html

你可能感兴趣的文章
TreeView控件使用总结
查看>>
PowerDesigner 生成的脚本取掉双引号
查看>>
改进卷积神经网络,你需要这14种设计模式
查看>>
Swap Nodes in Pairs
查看>>
js中数组以及for循环的使用
查看>>
「风格」与「设计」by杰夫·齐曼(Jeffrey Zeldman)
查看>>
js实现配置菜品规格时,向后台传一个json格式字符串
查看>>
c#winform,制作可编辑html编辑器
查看>>
20175326实验五 网络编程与安全
查看>>
数据库(class0507)
查看>>
ruby实现SHA1PRNG
查看>>
PHP登录时限
查看>>
Asp.net下from认证统一认证配置
查看>>
ECMAScript 面向对象技术:this 关键字
查看>>
51nod 1605:棋盘问题
查看>>
not in 语句使程充崩溃
查看>>
AngularJS bootStraping
查看>>
redis 缓存技术与memcache的区别
查看>>
android 学习Layout布局的使用
查看>>
安卓开发笔记(三十一):shape标签下子类根结点的具体使用
查看>>