1
1
package hackerrank.graphs
2
2
3
3
import java.util.*
4
- import kotlin.math.min
5
4
6
5
/* *
7
6
* isolated subgraphs가 아니라고 가정하고 간단하게 구현
@@ -20,27 +19,22 @@ fun roadsAndLibraries(
20
19
): Long {
21
20
22
21
val nodes = buildCityNodes(n, cities)
23
- val visited = mutableSetOf<CityNode >()
24
22
var totalCost = 0L
25
23
26
- nodes. forEach { node ->
27
- if (! visited.contains(node) ) {
28
- val distance = bfs(node, visited )
24
+ 0 .until(n). forEach { i ->
25
+ if (! nodes[i].visited ) {
26
+ val distance = bfs(nodes[i] )
29
27
30
- totalCost + = calculateMinCost(
31
- distance + 1 ,
32
- c_lib,
33
- distance,
34
- c_road
35
- )
28
+ totalCost + = if (c_road < c_lib) distance * c_road + c_lib
29
+ else (distance + 1 ) * c_lib
36
30
}
37
31
}
38
32
39
33
return totalCost
40
34
}
41
35
42
- private fun buildCityNodes (count : Int , cities : Array <Array <Int >>): List <CityNode > {
43
- val nodes = ( 1 .. count).map { CityNode (it ) }
36
+ private fun buildCityNodes (count : Int , cities : Array <Array <Int >>): Array <CityNode > {
37
+ val nodes = Array ( count) { CityNode () }
44
38
45
39
cities.forEach { link ->
46
40
val from = nodes[link[0 ] - 1 ]
@@ -53,57 +47,33 @@ private fun buildCityNodes(count: Int, cities: Array<Array<Int>>): List<CityNode
53
47
return nodes
54
48
}
55
49
56
- private fun bfs (root : CityNode , visited : MutableSet < CityNode > ): Int {
50
+ private fun bfs (root : CityNode ): Int {
57
51
58
52
var distance = 0
59
53
val queue = ArrayDeque <CityNode >()
60
54
queue.addLast(root)
61
55
62
56
while (queue.isNotEmpty()) {
63
- val node = queue.removeFirst()
64
- visited.add(node)
65
57
66
- node.neighbors.forEach { neighbor ->
67
- if (! visited.contains(neighbor)) {
58
+ val node = queue.removeFirst()
59
+ node.visited = true
60
+ node.neighbors.forEach {
68
61
62
+ if (! it.visited) {
69
63
distance++
70
- visited.add(neighbor)
71
- queue.addLast(neighbor)
72
-
64
+ it.visited = true
65
+ queue.addLast(it)
73
66
}
74
67
}
75
68
}
76
69
77
70
return distance
78
71
}
79
72
80
- private fun calculateMinCost (
81
- cityCount : Int ,
82
- c_lib : Int ,
83
- distance : Int ,
84
- c_road : Int
85
- ): Long {
86
-
87
- val librariesCost = cityCount * c_lib
88
- val roadsCost = distance * c_road + c_lib
89
-
90
- return min(
91
- librariesCost.toLong(),
92
- roadsCost.toLong()
93
- )
94
- }
95
-
96
- data class CityNode (val value : Int ) {
73
+ class CityNode {
97
74
75
+ var visited = false
98
76
val neighbors: MutableSet <CityNode > = mutableSetOf ()
99
-
100
- fun addNeighbor (neighbor : CityNode ): Boolean {
101
- return neighbors.add(neighbor)
102
- }
103
-
104
- override fun toString () = " CityNode(" +
105
- " value=$value , " +
106
- " neighbors=${neighbors.map { it.value }} " +
107
- " )"
77
+ fun addNeighbor (neighbor : CityNode ) = neighbors.add(neighbor)
108
78
109
79
}
0 commit comments