題目連結: https://zerojudge.tw/ShowProblem?problemid=d813

# 內容

這個世界上有許多不同的宗教信仰。你想要知道你就讀的大學中,學生們到底信了多少種不同的宗教。

在你就讀的大學中共有 n 個學生 (0 < n <= 50000)。顯然你不可能對每個人個別詢問他們的信仰,而且某些學生也不方便透露他們所信的宗教。而解決這些問題的一種可能的方法是詢問 m ( 0 <= m <= n (n-1)/2 ) 對學生他們是否信同一個宗教 (例如他們可能一起去某間教堂,會知道他們彼此信相同的宗教 )。由這些資料,即使你沒辦法知道每個人信哪個教,但是你可以估計出他們最多信了多少種不同的宗教。你可以假設每個學生最多信一個宗教。

# 解題思路

就是很基本的並查集阿,最後在掃一次有多少種不同宗教就好啦

# 程式碼

#include<bits/stdc++.h>
using namespace std;
int relation[50010];
int find_root(int x)
{
    if(relation[x]==x) return x;
    else return relation[x]=find_root(relation[x]);
}
int main(){
    for(int n,m,t=1,cnt=0;cin>>n>>m&&(n||m);t++,cnt=0){
        bool relate[50010]={};
        
        for(int i=1;i<=n;relation[i]=i,i++);
        for(int c=0,i,j;c<m&&cin>>i>>j;c++,relation[find_root(i)]=find_root(j));
        for(int i=1;i<=n;i++)
            if(!relate[find_root(i)])
                cnt++,relate[find_root(i)]=true;
        cout<<"Case "<<t<<": "<<cnt<<"\n";
    }
    return 0;
}
更新於 閱讀次數

用實際行動犒賞爆肝的我😀

Zrn Ye LinePay

LinePay