題目連結(jié):
題目意譯:
你被給定一整數(shù) n。現(xiàn)在有一個(gè)包含 n 個(gè)節(jié)點(diǎn)的無向圖,節(jié)點(diǎn)編號(hào)為 0 到 n - 1。你被給定一個(gè)二維整數(shù)陣列 edges[i] = [ai, bi] 代表著在圖中節(jié)點(diǎn) ai 和節(jié)點(diǎn) bi 之間一條無向邊。
回傳圖中的完全連通元件(Complete Connected Components)之?dāng)?shù)量。
一個(gè)連通元件為圖中的一個(gè)子圖,其滿足對(duì)於子圖中任意兩個(gè)節(jié)點(diǎn)之間都存在著一條路徑使得子圖中的節(jié)點(diǎn)不與子圖外的節(jié)點(diǎn)共用路徑上的一條邊。
一個(gè)連通元件如果滿足其節(jié)點(diǎn)每一對(duì)之間都有著邊存在,則其為完全的。
限制:
1 ≦ n ≦ 50
0 ≦ edges.length ≦ n × (n - 1) / 2
edges[i].length == 2
0 ≦ ai, bi ≦ n - 1
ai != bi
圖中無重邊。
範(fàn)例測(cè)資:
範(fàn)例 1:
輸入: n = 6, edges = [[0,1],[0,2],[1,2],[3,4]]
輸出: 3
解釋: 從上圖中可以看到圖中所有元件都是完全的。
範(fàn)例 2:
輸入: n = 6, edges = [[0,1],[0,2],[1,2],[3,4],[3,5]]
輸出: 1
解釋: 包含節(jié)點(diǎn) 0 、 1 和 2 的元件是完全的,因?yàn)槊恳粚?duì)節(jié)點(diǎn)之間都有一條邊存在;另一方面,包含節(jié)點(diǎn) 3 、 4 和 5 的元件不是完全的,因?yàn)楣?jié)點(diǎn) 4 和 5 之間沒有邊。因此圖中的完全連通元件數(shù)為 1。
解題思維:
無向圖的連通元件即為那些獨(dú)自一團(tuán)的子圖(即拔掉該子圖之後不會(huì)影響剩下的節(jié)點(diǎn)之連通性)。
因此直接掃過每一個(gè)節(jié)點(diǎn),對(duì)還沒有探訪過的節(jié)點(diǎn)進(jìn)行一次廣度優(yōu)先搜尋(Breadth First Search,BFS;範(fàn)例程式碼是用此者)或是深度優(yōu)先搜尋(Depth First Search,DFS)找到同一個(gè)元件中的節(jié)點(diǎn)並標(biāo)記為「已探訪」。當(dāng)然為了方便查詢每一個(gè)節(jié)點(diǎn)的「鄰居」,需要先建立鄰接表(Adjacency List,參見
這題)。
而為了判斷是否為完全圖,需要在過程中順便統(tǒng)計(jì)此連通元件總節(jié)點(diǎn)數(shù)與總邊數(shù)。因?yàn)橹剡叢淮嬖冢虼巳绻麨橥耆珗D,則將會(huì)滿足 E = V × (V - 1) ÷ 2,其中 E 為總邊數(shù)而 V 為總節(jié)點(diǎn)數(shù)。
最後掃完之後過程中統(tǒng)計(jì)到的即為所求完全連通元件之?dāng)?shù)量。
此次分享到此為止,如有任何更加簡(jiǎn)潔的想法或是有說明不清楚之地方,也煩請(qǐng)各位大大撥冗討論。