問題描述:
現如今世界上有如此多的宗教信仰,要將它們所有的都保持聯絡是非常困難的。你對於找出在乙個大學裡面同學們有多少不同的宗教信仰感興趣。
你知道這個大學裡面有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名學生,他們卻願意告訴你他們是否信仰同一宗教,你可以通過很多這樣的詢問估算學校裡的宗教數目的上限。你可以認為每名學生只會信仰最多...