PKU演習問メモ(6/14)
No. | 問題名 | 問題の種類および解法 | 難易度 |
---|---|---|---|
2524 | Ubiquitous Religions | Union find | ★★☆☆☆ |
2524 Ubiquitous Religions
問題概要
n人の学生達がいくつかの異なる宗教を信じている。
今m個の"学生aと学生bの信じている宗教が同じ"という関係が与えられるとき、学生達の信じる宗教の数を求めよ。
解法
僕にとっての初union find.
Union findのデータ構造を使う。
iwi先生の資料が凄く解りやすいのでこちら参照。
http://d.hatena.ne.jp/iwiwi/20100328/1269790390
この問題では経路圧縮のみで計算時間は余裕。
ソースコード
int n,m,cs=0; int u[50000]; bool v[50000]; int find(int x) { if(u[x]==x)return x; else return u[x]=find(u[x]); } void merge(int x,int y) { x=find(x),y=find(y); if(x!=y)u[x]=y; } int main() { while(scanf("%d%d",&n,&m),n) { rep(i,n)u[i]=i,v[i]=0; rep(i,m) { int a,b; scanf("%d%d",&a,&b); merge(a-1,b-1); } int ans=0; rep(i,n) { int root=find(i); if(!v[root])ans++,v[root]=1; } printf("Case %d: %d\n",++cs,ans); } return 0; }