poj1661 并查集简单运用

来源:互联网 发布:会计核算软件子系统 编辑:程序博客网 时间:2024/05/18 01:01

题目来源:题目

在学习并查集,自己在总结。关于算法的原理推荐这里,讲得很生动形象,很好懂。
这道题就是一个简单应用,就是套模版的。需要记录每个根节点下面元素的数量。可能算法还能更加优化。

#include <iostream>#include <cstdlib>#include <cstdio>#include <map>#include <vector>#include <string>#include <algorithm>#define MAX 30010using namespace std;int rank[MAX];int g[MAX];int find(int x){    if(g[x]==x) return x;    else{    g[x]=find(g[x]);  //带路径压缩     return g[x];    }    }void join(int x,int y){    int xroot = find(x);    int yroot = find(y);    if (xroot==yroot) return;    else{    g[yroot] = xroot;    rank[xroot]+=rank[yroot];    }}int main(){    int n,m,i,j,k,first,second;    while(scanf("%d%d",&n,&m)){       if(m==0&&n==0) break;       if(m==0){       cout<<"1\n";       continue;       }       for(i=0;i<n;i++){       g[i]=i;       rank[i]=1;       }       for(i=0;i<m;i++){         scanf("%d",&k);         scanf("%d",&first);         for(j=1;j<k;j++){            scanf("%d",&second);            join(first,second);            first=second;         }       }       cout<<rank[find(0)]<<endl;    }    //system("pause");    return 0;    }
0 0
原创粉丝点击