Arrays 如何在阵列中查找连接的组件
我正在尝试hackerrank中的一个算法问题。问题背后的想法是使用DFS通过数组查找连接组件(CC) 以下是测试用例: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], (十,五十五),,
查询=[
{
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?