Skip to content

Commit 16d162e

Browse files
committed
Improved 3558
1 parent 0d246f7 commit 16d162e

File tree

1 file changed

+35
-49
lines changed
  • src/main/kotlin/g3501_3600/s3558_number_of_ways_to_assign_edge_weights_i

1 file changed

+35
-49
lines changed

src/main/kotlin/g3501_3600/s3558_number_of_ways_to_assign_edge_weights_i/Solution.kt

Lines changed: 35 additions & 49 deletions
Original file line numberDiff line numberDiff line change
@@ -2,65 +2,51 @@ package g3501_3600.s3558_number_of_ways_to_assign_edge_weights_i
22

33
// #Medium #2025_05_25_Time_160_ms_(100.00%)_Space_149.66_MB_(100.00%)
44

5-
import java.util.LinkedList
6-
import java.util.Queue
7-
85
class Solution {
96
fun assignEdgeWeights(edges: Array<IntArray>): Int {
10-
val n = edges.size + 1
11-
val adj: MutableList<MutableList<Int>> = ArrayList<MutableList<Int>>()
12-
for (i in 0..n) {
13-
adj.add(ArrayList<Int>())
14-
}
15-
for (i in edges) {
16-
adj[i[0]].add(i[1])
17-
adj[i[1]].add(i[0])
18-
}
19-
val l = IntArray(n + 1)
20-
var max = 0
21-
l.fill(-1)
22-
val q: Queue<IntArray> = LinkedList<IntArray>()
23-
q.offer(intArrayOf(1, 0))
24-
l[1] = 0
25-
while (q.isNotEmpty()) {
26-
val curr = q.peek()!![0]
27-
val level = q.peek()!![1]
28-
if (l[max] < l[curr]) {
29-
max = curr
30-
}
31-
q.remove()
32-
for (next in adj[curr]) {
33-
if (l[next] != -1) {
34-
continue
35-
}
36-
q.offer(intArrayOf(next, level + 1))
37-
l[next] = level + 1
7+
if (pow2[0] == 0L) {
8+
pow2[0] = 1
9+
for (i in 1..<pow2.size) {
10+
pow2[i] = (pow2[i - 1] shl 1) % mod
3811
}
3912
}
40-
val dp: Array<IntArray> = Array<IntArray>(l[max]) { IntArray(2) }
41-
for (i in dp) {
42-
i.fill(-1)
13+
val n = edges.size + 1
14+
val adj = IntArray(n + 1)
15+
val degrees = IntArray(n + 1)
16+
for (edge in edges) {
17+
val u = edge[0]
18+
val v = edge[1]
19+
adj[u] += v
20+
adj[v] += u
21+
degrees[u]++
22+
degrees[v]++
4323
}
44-
return solve(0, 0, dp)
45-
}
46-
47-
private fun solve(ind: Int, odd: Int, dp: Array<IntArray>): Int {
48-
if (ind == dp.size) {
49-
return if (odd == 1) {
50-
1
51-
} else {
52-
0
24+
val que = IntArray(n)
25+
var write = 0
26+
var read = 0
27+
for (i in 2..n) {
28+
if (degrees[i] == 1) {
29+
que[write++] = i
5330
}
5431
}
55-
if (dp[ind][odd] != -1) {
56-
return dp[ind][odd]
32+
var distance = 0
33+
while (read < write) {
34+
distance++
35+
var size = write - read
36+
while (size-- > 0) {
37+
val v = que[read++]
38+
val u = adj[v]
39+
adj[u] -= v
40+
if (--degrees[u] == 1 && u != 1) {
41+
que[write++] = u
42+
}
43+
}
5744
}
58-
dp[ind][odd] =
59-
(solve(ind + 1, odd, dp) % MOD + solve(ind + 1, (odd + 1) % 2, dp) % MOD) % MOD
60-
return dp[ind][odd]
45+
return pow2[distance - 1].toInt()
6146
}
6247

6348
companion object {
64-
private const val MOD = 1e9.toInt() + 7
49+
private const val mod = 1e9.toInt() + 7
50+
private val pow2 = LongArray(100001)
6551
}
6652
}

0 commit comments

Comments
 (0)