Arrays 如何在阵列中查找连接的组件

Arrays 如何在阵列中查找连接的组件,arrays,ruby,algorithm,depth-first-search,connected-components,Arrays,Ruby,Algorithm,Depth First Search,Connected Components,我正在尝试hackerrank中的一个算法问题。问题背后的想法是使用DFS通过数组查找连接组件(CC) 以下是测试用例: 查询=[ { n_城市_道路:[9,2], (91,84),, 矩阵:[ [8, 2], [2, 9] ] }, { n_城市_道路:[5,9], (九二,二十三),, 矩阵:[ [2,1], [5, 3], [5,1], [3,4], [3,1], [5, 4], [4,1], [5,2], [4,2] ] }, { n_城市_道路:[8,3], (十,五十五),,

我正在尝试hackerrank中的一个算法问题。问题背后的想法是使用DFS通过数组查找连接组件(CC)

以下是测试用例:

查询=[
{
n_城市_道路:[9,2],
(91,84),,
矩阵:[
[8, 2], [2, 9]
]
},
{
n_城市_道路:[5,9],
(九二,二十三),,
矩阵:[
[2,1], [5, 3], [5,1], 
[3,4], [3,1],  [5, 4], 
[4,1], [5,2],  [4,2]
]
},
{
n_城市_道路:[8,3],
(十,五十五),,
矩阵:[
[6,4], [3,2], [7,1]
]
},
{
n城市和道路:[1,0],
(五,三),,
矩阵:[]
},
{
n_城市_道路:[2,0],
(二,一),,
矩阵:[]
}
]
查询。每个do |查询|
(n_城市,n_路),(c_lib,c_路)=[*查询[:n_城市,n_路],[*查询[:c_lib_路]]
城市道路和图书馆,城市图书馆,城市道路,查询[:矩阵]
结束
输出应为:

805
184
80
5
204
我下面的当前解决方案在某些情况下可以获得CC,但不是所有情况下都可以

def dfs(i, visited, matrix)
  visited[i] = true
  unless matrix[i].nil?
    matrix[i].each do |j|
      unless visited[j]
        dfs j, visited, matrix
      end
    end
  end
end

def roads_and_libraries(no_cities, c_lib, c_road, cities)
  return c_lib * no_cities if c_lib <= c_road
  visited, count = Array.new(no_cities, false), 0

  (0..no_cities).each do |i|
    unless visited[i]
      count += 1
      dfs i, visited, cities
    end
  end
  p (c_road * (no_cities - count)) + (c_lib * count)
end
我正在努力理解如何正确使用DFS来查找连接的组件。不知道我哪里出错。

只需打印这行:

p roads_and_libraries n_city, c_lib, c_road, query[:matrix]
不是这个

p (c_road * (no_cities - count)) + (c_lib * count)
因为方法中有一个返回:

return c_lib * no_cities if c_lib <= c_road
因此,要处理空矩阵,一种方法是将其作为第一行添加到
dfs
方法中:

matrix = [[1,1]] if matrix.empty?

哦是你的权利!谢谢你注意到这一点。我做了更改,但现在输出是这样的:
805184 807 305
我不知道你的算法,但也许矩阵不能为空,至少它应该是[[1,1]]。请看编辑。从技术上讲,我的算法也应该处理空矩阵。根据hackerrank测试用例的最后一次编辑,处理空矩阵时添加一行到dfs方法。
roads_and_libraries 1, 5, 3, [[1,1]] #=> 5
roads_and_libraries 2, 102, 1, [[1,1]] #=> 204
matrix = [[1,1]] if matrix.empty?