返回首页

DFS:图的连通性与遍历

一、面试常考点

1. 如何统计连通分量

遍历所有节点,未访问节点发起一次 DFS,计数加一。

2. 如何防止重复访问

使用 visited 集合或数组。

二、细节介绍

1. 邻接表建图

稀疏图优先邻接表,空间更省。

2. 无向图遍历

双向建边,访问时靠 visited 防回头。

三、示例代码

function countComponents(n, edges) {
  const g = Array.from({ length: n }, () => [])
  for (const [u, v] of edges) {
    g[u].push(v)
    g[v].push(u)
  }

  const visited = Array(n).fill(false)

  function dfs(u) {
    visited[u] = true
    for (const v of g[u]) {
      if (!visited[v]) dfs(v)
    }
  }

  let count = 0
  for (let i = 0; i < n; i++) {
    if (!visited[i]) {
      dfs(i)
      count++
    }
  }
  return count
}

四、常用应用场景

1. 社交网络社区划分

统计用户关系图中的连通块。

2. 服务依赖分组

识别互相可达的服务子图。