[原]poj-2324(裸併合検査集)
1649 ワード
テーマリンク:
http://poj.org/problem?id=2524
n個人は、mは人の宗教に対して同じで、出力は全部でいくつの異なる宗教がありますか?
コードは以下の通りです
作者:u 011652573发表于2014-3-3 19:27:19
原文のリンク
コメント:45
コメントを見る
http://poj.org/problem?id=2524
n個人は、mは人の宗教に対して同じで、出力は全部でいくつの異なる宗教がありますか?
コードは以下の通りです
#include<iostream>
#include<cstdio>
using namespace std;
#define M 500100
int 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。。。。 作者:u 011652573发表于2014-3-3 19:27:19
原文のリンク
コメント:45
コメントを見る