@@ -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-
85class 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