poj-2524(裸并查集)

来源:互联网 发布:java 读取文件流 编辑:程序博客网 时间:2024/06/05 19:49

题目链接:

http://poj.org/problem?id=2524


题意: n个人,m对人宗教相同,输出一共有多少个不同的宗教。

代码如下:

#include<iostream>#include<cstdio>using namespace std;#define M 500100int par[M];int h[M];int n, m;void init(int a){  for(int i = 1; i <= a; i++)  {    par[i] = i;    h[i] = 0;  }}int Find(int a){  if(par[a] != a)  {    return par[a] = Find(par[a]);  }  else return a;}void Union(int a,int b){  a = Find(a);  b = Find(b);  if(a == b) return;  else  {    if(h[a] > h[b]) par[b] = a;    else    {      if(h[a] == h[b]) h[b]++;      par[a] = b;    }  }}int main(){ int cases = 1;  while(scanf("%d%d",&n,&m) == 2)  {    if(n == 0) break;    init(n);    int Count = 0;    for(int i = 0; i < m; i++)    {      int a,b;      scanf("%d%d",&a,&b);      Union(a,b);    }    for(int i = 1; i <= n; i++)          {      if(par[i] == i) Count++;   //自己是根节点的是一类宗教    }    cout<<"Case "<<cases++<<": "<<Count<<endl;  }  return 0;}



之前wa了好多次,原因是定义了一个visit[ ]数组来记录visit[ par[i] ]有没有被访问来记录宗教数,但忽略了节点可能不是直接连在根节点上的情况。。。Orz。。。。 
 
0 0
原创粉丝点击