題目連結(jié):
題目意譯:
現(xiàn)在有一個有著 n 的節(jié)點的雙向圖,其中每一個節(jié)點編號為 0 到 n - 1。圖上的邊是以一個二維整數(shù)陣列 edges 所表示,其中 edges[i] = [ui, vi] 代表著節(jié)點 ui 到節(jié)點 vi 之間有一條邊存在。每個節(jié)點對之間最多連接一條邊,並且沒有節(jié)點有連到自己本身的邊。
回傳圖中最短環(huán)的長度。如果環(huán)不存在,則回傳 -1。
一個「環(huán)」為開始和結(jié)束為同一個節(jié)點的路徑,而路徑中每一條邊恰好只使用一次。
限制:
2 ≦ n ≦ 1000
1 ≦ edges.length ≦ 1000
edges[i].length == 2
0 ≦ ui, vi < n
ui != vi
不存在重邊。
範例測資:
範例 1:
輸入: n = 7, edges = [[0,1],[1,2],[2,0],[3,4],[4,5],[5,6],[6,3]]
輸出: 3
解釋: 長度最小的環(huán)為: 0 -> 1 -> 2 -> 0
範例 2:
輸入: n = 4, edges = [[0,1],[0,2]]
輸出: -1
解釋: 圖中無環(huán)。
解題思維:
首先,我們可以看到因為圖中保證不存在自環(huán)以及重邊。因此圖中如果有環(huán)的話,其長度必定至少為 3。
接著,我們窮舉所有可能的「起始節(jié)點」。假設(shè)現(xiàn)在從節(jié)點 i 出發(fā),則我們用廣度優(yōu)先搜尋(Breadth First Search)來找出到其他節(jié)點的最短距離。
假設(shè)現(xiàn)在位於節(jié)點 x,一旦在過程中遇到「擴張」出去的節(jié)點(設(shè)該節(jié)點為 y)是走過的(即已經(jīng)知道從節(jié)點 i 走到 y 的最短距離)並且 x 不是從 y 走過來的(即代表著 x 不是從 y 擴張而走到的。注意,這件事情只會成立於沒有自環(huán)和重邊的情況下),則代表著從 x 到 y 之間有環(huán)。
而其長度「最多」會是 Dx + Dy + 1,其中 Dx 為 i 走到 x 的最短距離、Dy 則是從 i 走到 y 的最短距離。雖然可以藉由儲存更多資訊來決定出確切的長度。但是因為我們會窮舉所有可能的起始節(jié)點,因此必定會在某時某刻窮舉到環(huán)上的點,進而求出其確切的長度。
而這些長度的最小者即為所求。
此次分享到此為止,如有任何更加簡潔的想法或是有說明不清楚之地方,也煩請各位大大撥冗討論。