引入-朋友圈
班上有 N 名學(xué)生叹卷。其中有些人是朋友舒岸,有些則不是绅作。他們的友誼具有是傳遞性。
如果已知 A 是 B 的朋友蛾派,B 是 C 的朋友俄认,那么我們可以認(rèn)為 A 也是 C 的朋友。
所謂的朋友圈碍脏,是指所有朋友的集合梭依。
給定一個 N * N 的矩陣 M稍算,表示班級中學(xué)生之間的朋友關(guān)系典尾。
如果M[i][j] = 1,表示已知第 i 個和 j 個學(xué)生互為朋友關(guān)系糊探,否則為不知道钾埂。
你必須輸出所有學(xué)生中的已知的朋友圈總數(shù)。
示例 1:
輸入:
[[1,1,0],
[1,1,0],
[0,0,1]]
輸出: 2
說明:已知學(xué)生0和學(xué)生1互為朋友科平,他們在一個朋友圈褥紫。
第2個學(xué)生自己在一個朋友圈。所以返回2瞪慧。
示例 2:
輸入:
[[1,1,0],
[1,1,1],
[0,1,1]]
輸出: 1
說明:已知學(xué)生0和學(xué)生1互為朋友髓考,學(xué)生1和學(xué)生2互為朋友,所以學(xué)生0和學(xué)生2也是朋友弃酌,所以他們?nèi)齻€在一個朋友圈氨菇,返回1。
注意:
N 在[1,200]的范圍內(nèi)妓湘。
對于所有學(xué)生查蓉,有M[i][i] = 1。
如果有M[i][j] = 1榜贴,則有M[j][i] = 1豌研。
概念
并查集是一種數(shù)據(jù)結(jié)構(gòu),用于處理對N個元素的集合劃分和判斷是否屬于同集合的問題。顧名思義鹃共,它支持兩種操作:并和查鬼佣。
查就是查詢兩個元素是否屬于同一個集合。并就是合并兩個小集合成為一個大集合及汉。
具體在實踐中沮趣,并也是通過指定兩個元素、合并這兩個元素所屬的集合來實現(xiàn)的坷随。
并查集內(nèi)部用一個上邊介紹的層次結(jié)構(gòu)來表示房铭。對于每一個元素,只需要記錄它的上級代表元素的編號温眉,因此用一個長度為N的數(shù)組即可實現(xiàn)缸匪。
查操作和并操作的具體過程是這樣的:
查:通過逐級向上追溯的方法,找到兩個元素各自的頂級代表类溢,然后判斷頂級代表是否相同從而判斷兩個元素是否屬于同一個集合凌蔬。在查找后進(jìn)行路徑壓縮,從而將下次查找的復(fù)雜度變成1闯冷。
并:對于給定的兩個元素砂心,先找到他們各自的頂級代表,然后把代表1的上級元素設(shè)為代表2即可蛇耀”绲可以看到,并其實也依賴于查纺涤。在查結(jié)束后译暂,同樣也進(jìn)行路徑壓縮。