From 50e06d1f104f0096028785df681558693a8eb5df Mon Sep 17 00:00:00 2001 From: gson Liang Date: Tue, 6 Oct 2026 01:06:11 +0800 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20(connected-undirect-node):=20golang?= =?UTF-8?q?=20with=20adjacency=20map=20with=20dfs?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../solution.go | 34 +++++++++++++++++-- 1 file changed, 32 insertions(+), 2 deletions(-) diff --git a/go/graphs/0010-number-of-connected-components-in-an-undirected-graph/solution.go b/go/graphs/0010-number-of-connected-components-in-an-undirected-graph/solution.go index d5b900b..92386b7 100644 --- a/go/graphs/0010-number-of-connected-components-in-an-undirected-graph/solution.go +++ b/go/graphs/0010-number-of-connected-components-in-an-undirected-graph/solution.go @@ -1,6 +1,36 @@ package main func Solve(n int, edges [][]int) int { - // TODO(scaffold): implement, then delete this line - panic("not implemented") + // 1 建立 adjacency list 來紀錄每個節點相連的狀況 + // 2 透過 DFS 逐個節點透過 adjacency list 來走訪節點,只要每次走完就把 counter 加一 + adjacencyMap := make(map[int][]int, n) + for _, edge := range edges { + adjacencyMap[edge[0]] = append(adjacencyMap[edge[0]], edge[1]) + adjacencyMap[edge[1]] = append(adjacencyMap[edge[1]], edge[0]) + } + // 紀錄走訪過得 + visited := make(map[int]struct{}, n) + + var dfs func(node int) + dfs = func(node int) { + if _, ok := visited[node]; ok { + return + } + visited[node] = struct{}{} + adjacencyNodes := adjacencyMap[node] + for _, adjacencyNode := range adjacencyNodes { + if _, ok := visited[adjacencyNode]; !ok { + dfs(adjacencyNode) + } + } + } + + result := 0 + for i := 0; i < n; i++ { + if _, ok := visited[i]; !ok { + dfs(i) + result++ + } + } + return result }