並查集的具體例題

2021-07-27 15:32:04 字數 1009 閱讀 3362

lmh平常愛聽歌,所以買了很多的cd來收藏,但是因為平常整理不當,所以忘記了這些cd的歌手是誰。現在他想知道他到底收藏了多少位歌手的**,於是他想了乙個辦法,同時拿出兩個cd來聽,可以分辨出來是否為同乙個歌手唱的。(如果沒有說明則認為是沒有分辨出來,為不同歌手)現在他列了乙個表記錄哪些**是同一歌手,但他面對著這一堆記錄不知如何處理,請你告訴他到底他有多少個歌手的**。

第一行n,m。n表示cd的個數(標號分別為1到n),m表示lmh所分辨出來的共有幾組。接下來的m行每一行有兩個數a,b。表示a唱片和b唱片是同乙個歌手。(1<=n,m<=10000)

總計的歌手數量。

10 9

1 23 4

5 24 6

2 68 7

9 71 6

2 4

3題目的步驟及思路的分析:

首先假設這10個cd都是不同的歌手,用乙個一維陣列f,用下表來表示這10個cd,用每個下表對應的單元格來儲存每個cd的歌手是誰,所以此刻1號cd就是1號歌手唱的,f[1]為1,以此類推。

現在進行合併,第一條線索「1號cd和2號cd是同乙個歌手唱的」,原來「1號和2號cd的歌手是不同的」,所以將2號cd歸給1號歌手(1號歸給2號也是可以的,但必須規定好靠哪一邊)。所以2號cd就變成了1號歌手的歌,將f[2]改為1。再依此類推。

已經ac過的**:(這是kruskal演算法)

#include

#include

#include

using namespace std;

int n,m,x,y;

int arr[10005];

int getf(int v)

}int merg(int v,int u)

return 0;

}int main()

for(int i=1; i<=m; i++)

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

printf("%d\n",sum);

}return 0;}

並查集例題

題目描述 假如已知有n個人和m對好友關係 存於集合r 如果兩個人是直接或間接的好友 好友的好友的好友 則認為他們屬於同乙個朋友圈。請寫程式求出這n個人裡一共有多少個朋友圈。輸入 輸入包含多個測試用例,每個測試用例的第一行包含兩個正整數 n m,1 n,m 100000。接下來有m行,每行分別輸入兩個...

並查集例題

找出根節點,如果只有乙個節點,根節點是自己 作迴圈,如果父節點不是自己,一直迴圈 public int find int x return x public void union int x,int y parent rootx rooty count 並查集自己的理解 剛開始每個節點都是看作單獨的...

並查集的例題

題意為 已知學校有n個學生 想知道有多少個宗教,但是不能乙個乙個問學生 已知兩個一起的是乙個宗教的,現可以問m對學生,請求出最多有多少個宗教 輸入資料 10 4 2 3 4 5 4 8 5 8 答案為7 由題知採用並查集求解 可看做二叉樹 include using namespace std co...