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;}


原创粉丝点击