hdu 2473 简单并查集
来源:互联网 发布:ui设计书籍 知乎 编辑:程序博客网 时间:2024/05/10 17:56
/*题目大意,就是输入的如果为M,那就合并两个集合,否则将此点分离出去,问一共有多少个集合*/#include<iostream>#include<cstdlib>#include<cstdio>#include<algorithm>#include<cstring>#include<queue>using namespace std;const int maxn=2000012;int n,m,fa[maxn],ans,idx[maxn],vis[maxn];char op[2];int find(int x)//非递归{ int r,t,i; r=x; while(r!=fa[r]) r=fa[r]; i=x; while(i!=r) { t=fa[i]; fa[i]=r; i=t; } return r;}void Union(int u,int v,int fu,int fv){ if(fu>fv)swap(fu,fv); fa[fv]=fu;}int main(){ int u,v,i,j,cas=1,len; while(~scanf("%d%d",&n,&m),(n||m)) { for(ans=0,i=0; i<n; i++) { fa[i]=i; idx[i]=i; } len=n; for(i=1; i<=m; i++) { scanf("%s",&op); if(op[0]=='M') { scanf("%d%d",&u,&v); int x=find(idx[u]),y=find(idx[v]); if(x!=y) { Union(u,v,x,y); } } else { scanf("%d",&u); fa[n]=n; idx[u]=n++; } } memset(vis,0,sizeof(vis)); for(i=0;i<len;i++) { int x=find(idx[i]); if(!vis[x]) { vis[x]=1; ans++; } } printf("Case #%d: %d\n",cas++,ans); } return 0;}