nyoj_1022:合纵连横(并查集删点)
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了nyoj_1022:合纵连横(并查集删点)相关的知识,希望对你有一定的参考价值。
http://acm.nyist.net/JudgeOnline/problem.php?pid=1022
只附代码好了
#include<bits/stdc++.h> using namespace std; const int N=200005; int a[N],b[N],vis[N]; int n,m,add,kase; void init() { for(int i=0;i<n;i++) a[i]=i,b[i]=i; add=n; memset(vis,0,sizeof(vis)); } int Find(int x) { return x==a[x]? x:a[x]=Find(a[x]); } void Unite(int x,int y) //入口由b[N]控制 { x=Find(x),y=Find(y); a[x]=y; } void Remove(int x) { a[add]=add,b[x]=add; add++; //金蝉脱壳 } int main() { while(cin>>n>>m) { init(); while(m--) { char op;int x,y; cin>>op; if(op==‘U‘) { cin>>x>>y; Unite(b[x],b[y]); } else { cin>>x; Remove(x); } } int ans=0; for(int i=0;i<n;i++) { if(!vis[Find(b[i])]) ans++,vis[Find(i)]=1; } printf("Case #%d: %d\n",++kase,ans); } }
以上是关于nyoj_1022:合纵连横(并查集删点)的主要内容,如果未能解决你的问题,请参考以下文章
hdu 2473 Junk-Mail Filter 并查集删点,模板题
ZOJ 3261 - Connections in Galaxy War ,并查集删边