hdu 2473 并差集的删除操作


虚拟数组 待定/。
#include<iostream> #include<algorithm> #include<set>
using namespace std; int f[1000001],n,m; int hash1[100001]; set<int> st; void init() { for(int i=0;i<n;i++) { f[i]=i; hash1[i]=i; } } int find(int x) { if(x==f[x]) return f[x]; f[x]=find(f[x]); return f[x]; } void Union(int x,int y) { int a=find(x); int b=find(y); if(a==b) return ; f[a]=b; } int main() { int cas=0,a,b; char str[5]; while(scanf("%d %d",&n,&m)==2 &&(n||m)) { init(); st.clear(); int num=n; while(m--) { scanf("%s",str); if(str[0]=='S') { scanf("%d",&a); hash1[a]=num++; f[hash1[a]]=hash1[a]; } else { scanf("%d %d",&a,&b); Union(hash1[a],hash1[b]); } } int ans=0; for(int i=0;i<n;i++) { // printf("%d %d\n",hash1[i],find(hash1[i])); st.insert(find(hash1[i])); } printf("Case #%d: %d\n",++cas,st.size()); } return 0; }
posted @ 2016-08-22 14:42  猪突猛进!!!  阅读(141)  评论(0编辑  收藏  举报