- Notifications
You must be signed in to change notification settings - Fork 4
/
Copy path1584-min-cost-to-connect-all-points.rb
75 lines (66 loc) · 2.14 KB
/
1584-min-cost-to-connect-all-points.rb
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
# frozen_string_literal: true
# 1584. Min Cost to Connect All Points
# Medium
# https://leetcode.com/problems/min-cost-to-connect-all-points
=begin
You are given an array points representing integer coordinates of some points on a 2D-plane, where points[i] = [xi, yi].
The cost of connecting two points [xi, yi] and [xj, yj] is the manhattan distance between them: |xi - xj| + |yi - yj|, where |val| denotes the absolute value of val.
Return the minimum cost to make all points connected. All points are connected if there is exactly one simple path between any two points.
Example 1:
Input: points = [[0,0],[2,2],[3,10],[5,2],[7,0]]
Output: 20
Explanation:
We can connect the points as shown above to get the minimum cost of 20.
Notice that there is a unique path between every pair of points.
Example 2:
Input: points = [[3,12],[-2,5],[-4,1]]
Output: 18
Constraints:
* 1 <= points.length <= 1000
* -106 <= xi, yi <= 106
* All pairs (xi, yi) are distinct.
=end
# @param {Integer[][]} points
# @return {Integer}
# @param {Integer[][]} points
# @return {Integer}
defmin_cost_connect_points(points)
return0ifpoints.length == 1
min_dist=Array.new(points.length,Float::MAX)
cost=0
cur=0
connected_edges=1
len=points.length
visited=Array.new(len,false)
visited[0]=true
whileconnected_edges < points.length
min_edge=Float::MAX
next_edge= -1
(0..points.length - 1).eachdo |i|
nextifi == cur
if !visited[i]
dist=(points[cur][0] - points[i][0]).abs + (points[cur][1] - points[i][1]).abs
min_dist[i]=[dist,min_dist[i]].min
ifmin_edge > min_dist[i]
min_edge=min_dist[i]
next_edge=i
end
end
end
cost=cost + min_edge
cur=next_edge
visited[cur]=true
connected_edges=connected_edges + 1
end
cost
end
# **************** #
# TEST #
# **************** #
require"test/unit"
classTest_min_cost_connect_points < Test::Unit::TestCase
deftest_
assert_equal20,min_cost_connect_points([[0,0],[2,2],[3,10],[5,2],[7,0]])
assert_equal18,min_cost_connect_points([[3,12],[-2,5],[-4,1]])
end
end