宗教信仰(並查集)

2021-06-19 05:12:37 字數 1303 閱讀 3076

問題描述:

現如今世界上有如此多的宗教信仰,要將它們所有的都保持聯絡是非常困難的。你對於找出在乙個大學裡面同學們有多少不同的宗教信仰感興趣。 

你知道這個大學裡面有n個學生。如果讓你去乙個乙個問每乙個學生的宗教信仰是不可能的。而且,許多學生不願意表露他們的宗教信仰。有個方法可以避免這個問題,就是去問m(0<=m<=n(n-1)/2)對學生,並且問它們是否同乙個宗教信仰(比如說如果他們是同乙個宗教信仰,他們也許相互認識)。對於這個資料,你可能並不知道嗎,每乙個學生的信仰,但是你可以知道最多有多少個不同的宗教信仰在這個校園裡面。你可以假設每乙個學生有至多乙個宗教信仰 

輸入資料報括情況的數目,每一種情況包括有資料n和m,接下來的m行包括了兩個資料i和j,表示學生i和j是同乙個宗教信仰。學生是從1到n編號的,若n=0並且m=0則表示輸入結束 

對於每一種情況,顯示出在這個學校裡學生們的最大的不同宗教信仰數 

sample input

10 9 

1 2 

1 3 

1 4 

1 5 

1 6 

1 7 

1 8 

1 9 

1 10

10 4 

2 34 5 

4 8 

5 8 

0 0sample output

case 1: 1

case 2: 7

解題報告:

並查集的基礎題,將每個人抽象為節點來討論

step1:首先將每個節點視為根節點,初始化是每個節點的父節點都是本身。

step2:如果要使不同宗教信仰是最多的,就假設初始化是最多的,就假設初始化時每個人能的宗教信仰都不同,那麼最大宗教信仰數目sum 就是人數了,即sum=n;

step3;設輸入一對宗教信仰相同的人,並且這對人當前屬於不同集合,則最大宗教信仰數sum-=1;

step4;當所有的輸出都結束後,sum的值就是問題的答案了

c語言**:

#includeint f[50005],sum;

int find(int x) //帶路徑壓縮的查詢

void make(int a,int b)//並查集的並操作

}int main()

printf("case %d: %d\n",p++,sum);

// for(i=1;i<=n;i++)

// printf("%d ",f[i]);

}}

並查集 宗教信仰

時間限制 1 sec 記憶體限制 128 mb 提交 15 解決 8 提交 狀態 討論版 世界上有許多不同的宗教,現在有乙個你感興趣的問題 找出多少不同的宗教,在你的大學中的大學生信仰了多少種不同的宗教。你知道在你的大學有n個學生 0輸入包含多組測試資料。每組測試資料的開頭包含兩個整數n和m。接下來...

宗教信仰(並查集)

問題描述 現如今世界上有如此多的宗教信仰,要將它們所有的都保持聯絡是非常困難的。你對於找出在乙個大學裡面同學們有多少不同的宗教信仰感興趣。你知道這個大學裡面有n個學生。如果讓你去乙個乙個問每乙個學生的宗教信仰是不可能的。而且,許多學生不願意表露他們的宗教信仰。有個方法可以避免這個問題,就是去問m 0...

做練習 宗教信仰(並查集)

世界上有許多宗教,你感興趣的是你學校裡的同學信仰多少種宗教。你的學校有n名學生 0 n 50000 你不太可能詢問每個人的宗教信仰,因為他們不太願意透露。但是當你同時找到2名學生,他們卻願意告訴你他們是否信仰同一宗教,你可以通過很多這樣的詢問估算學校裡的宗教數目的上限。你可以認為每名學生只會信仰最多...