@@ -2,65 +2,51 @@ package g3501_3600.s3558_number_of_ways_to_assign_edge_weights_i
2
2
3
3
// #Medium #2025_05_25_Time_160_ms_(100.00%)_Space_149.66_MB_(100.00%)
4
4
5
- import java.util.LinkedList
6
- import java.util.Queue
7
-
8
5
class Solution {
9
6
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
38
11
}
39
12
}
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]++
43
23
}
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
53
30
}
54
31
}
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
+ }
57
44
}
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()
61
46
}
62
47
63
48
companion object {
64
- private const val MOD = 1e9.toInt() + 7
49
+ private const val mod = 1e9.toInt() + 7
50
+ private val pow2 = LongArray (100001 )
65
51
}
66
52
}
0 commit comments