【BZOJ1015】[JSOI2008]星球大战starwar 并查集
2014-10-04 15:28
471 查看
只需离线反向维护并查集,建立被摧毁的边,并更新答案……
[JSOI2008]星球大战starwar C++代码实现:
[JSOI2008]星球大战starwar C++代码实现:
#include <cstdio> #include <cstring> #include <iostream> #include <algorithm> using namespace std; #define N 400010 #define M 200010 int n,m; int head ,to[2*M],next[2*M],cnt; int f ,t ,v ,ans ; void add(int x,int y) { to[++cnt]=y; next[cnt]=head[x]; head[x]=cnt; } int find(int x) { return x==f[x]?x:f[x]=find(f[x]); } int main() { cin>>n>>m; for(int x,y,i=1;i<=m;i++) scanf("%d%d",&x,&y), add(x+1,y+1),add(y+1,x+1); cin>>t[0]; for(int i=1;i<=t[0];i++) scanf("%d",&t[i]), v[++t[i]]=1; for(int i=1;i<=n;i++) f[i]=i; ans[t[0]+1]=n-t[0]; for(int i=1;i<=n;i++) if(!v[i]) for(int j=head[i];j;j=next[j]) if(!v[to[j]]) { int fx=find(i),fy=find(to[j]); if(fx!=fy) f[fx]=fy,ans[t[0]+1]--; } for(int i=t[0];i;i--) { v[t[i]]=0;ans[i]=ans[i+1]+1; for(int j=head[t[i]];j;j=next[j]) if(!v[to[j]]) { int fx=find(t[i]),fy=find(to[j]); if(fx!=fy) f[fx]=fy,ans[i]--; } } for(int i=1;i<=t[0]+1;i++) printf("%d\n",ans[i]); }
相关文章推荐
- bzoj1015: [JSOI2008]星球大战starwar(并查集)
- BZOJ 1015: [JSOI2008]星球大战starwar( 并查集 )
- bzoj 1015: [JSOI2008]星球大战starwar 并查集
- 【bzoj 1015】[JSOI2008]星球大战starwar(并查集)
- BZOJ 1015: [JSOI2008]星球大战starwar(并查集求连通块+离线处理)
- bzoj 1015: [JSOI2008]星球大战starwar 并查集+离线处理
- bzoj1015: [JSOI2008]星球大战starwar(并查集+倒推)
- BZOJ 1015: [JSOI2008]星球大战starwar 并查集 离线维护
- bzoj1015: [JSOI2008]星球大战starwar(并查集)
- bzoj1015 [JSOI2008]星球大战starwar 并查集
- 【BZOJ】1015: [JSOI2008]星球大战starwar(并查集)
- bzoj 1015 JSOI2008 星球大战starwar 并查集
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
- [BZOJ1015][JSOI2008]星球大战starwar(并查集)
- [BZOJ 1015][JSOI2008]星球大战starwar:并查集
- BZOJ 1015: [JSOI2008]星球大战starwar【并查集】
- BZOJ1015[JSOI2008]星球大战starwar[并查集]
- BZOJ1015 [JSOI2008]星球大战starwar(并查集)
- 并查集——BZOJ1015 [JSOI2008]星球大战starwar
- 【bzoj 1015[JSOI2008]星球大战starwar 反向并查集