[英]How to find connected components in an array
I'm attempting an algorithm problem in hackerrank, Roads and Libraries . 我正在hackerrank, Roads and Libraries中尝试算法问题。 The idea behind the problem is to use DFS to find connected components (CC) using an array.
问题的根源是使用DFS使用数组查找连接的组件(CC)。
Here is the test case: 这是测试用例:
queries = [
{
n_cities_roads: [9,2],
c_lib_road: [91, 84],
matrix: [
[8, 2], [2, 9]
]
},
{
n_cities_roads: [5,9],
c_lib_road: [92, 23],
matrix: [
[2,1], [5, 3], [5,1],
[3,4], [3,1], [5, 4],
[4,1], [5,2], [4,2]
]
},
{
n_cities_roads: [8,3],
c_lib_road: [10, 55],
matrix: [
[6,4], [3,2], [7,1]
]
},
{
n_cities_roads: [1, 0],
c_lib_road: [5, 3],
matrix: []
},
{
n_cities_roads: [2, 0],
c_lib_road: [102, 1],
matrix: []
}
]
queries.each do |query|
(n_city, n_road), (c_lib, c_road) = [*query[:n_cities_roads]], [*query[:c_lib_road]]
roads_and_libraries n_city, c_lib, c_road, query[:matrix]
end
The output should be: 输出应为:
805
184
80
5
204
My current solution below can get CC for some cases, but not for all. 我目前的以下解决方案在某些情况下可以获得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
The output of the test with my code above is: 上面我的代码的测试输出为:
805
184
7
305
I'm struggling to understand how to use DFS correctly to find connected components. 我正在努力了解如何正确使用DFS查找连接的组件。 Not sure where I'm going wrong.
不知道我要去哪里错了。
Just print this line: 只需打印以下行:
p roads_and_libraries n_city, c_lib, c_road, query[:matrix]
Not this 不是这个
p (c_road * (no_cities - count)) + (c_lib * count)
Because there is a return in the method: 因为方法中有返回值:
return c_lib * no_cities if c_lib <= c_road
I don't know the algorithm, but it seems that the matrix can not be empty []
, at least it has to be [[1,1]]
to get the required output: 我不知道算法,但似乎矩阵不能为空
[]
,至少必须为[[1,1]]
才能获得所需的输出:
roads_and_libraries 1, 5, 3, [[1,1]] #=> 5
roads_and_libraries 2, 102, 1, [[1,1]] #=> 204
So, to deal with empty matrix, one way is to just add this as first line in dfs
method: 因此,要处理空矩阵,一种方法是将其添加为
dfs
方法的第一行:
matrix = [[1,1]] if matrix.empty?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.