@@ -9,42 +9,31 @@ export default function minimumScore(
9
9
) ;
10
10
11
11
for ( const [ a , b ] of edges ) {
12
- addEdge ( edgeMap , a , b ) ;
13
- addEdge ( edgeMap , b , a ) ;
12
+ edgeMap [ a ] . push ( b ) ;
13
+ edgeMap [ b ] . push ( a ) ;
14
14
}
15
15
const children = new Array < Array < number > > ( nums . length ) . fill ( [ ] ) . map ( ( ) =>
16
16
[ ] as Array < number >
17
17
) ;
18
18
19
- const parent = new Array < number | null > ( nums . length ) . fill ( null ) ;
20
19
const visited = new Set < number > ( ) ;
21
20
const xor = new Array < number > ( nums . length ) . fill ( 0 ) ;
22
- const ancestor = new Array ( n ) . fill ( 0 ) . map ( ( ) =>
21
+ const ancestorToGrandson = new Array ( n ) . fill ( 0 ) . map ( ( ) =>
23
22
new Array < boolean > ( n ) . fill ( false )
24
23
) ;
25
24
26
25
const root = 0 ;
27
- bfs ( [ root ] , visited , edgeMap , children , parent , xor , nums ) ;
28
-
29
- for ( let i = 1 ; i < n ; i ++ ) {
30
- let j = parent [ i ] ;
31
-
32
- while ( typeof j === "number" ) {
33
- ancestor [ j ] [ i ] = true ;
34
-
35
- j = parent [ j ] ;
36
- }
37
- }
26
+ bfs ( [ root ] , visited , edgeMap , children , ancestorToGrandson , xor , nums ) ;
38
27
39
28
let ans = Infinity ;
40
29
for ( let i = 1 ; i < n ; i ++ ) {
41
30
for ( let j = i + 1 ; j < n ; j ++ ) {
42
31
let a : number , b : number , c : number ;
43
- if ( ancestor [ i ] [ j ] ) {
32
+ if ( ancestorToGrandson [ i ] [ j ] ) {
44
33
a = xor [ 0 ] ^ xor [ i ] ;
45
34
b = xor [ i ] ^ xor [ j ] ;
46
35
c = xor [ j ] ;
47
- } else if ( ancestor [ j ] [ i ] ) {
36
+ } else if ( ancestorToGrandson [ j ] [ i ] ) {
48
37
a = xor [ 0 ] ^ xor [ j ] ;
49
38
b = xor [ j ] ^ xor [ i ] ;
50
39
c = xor [ i ] ;
@@ -65,7 +54,7 @@ function bfs(
65
54
visited : Set < number > ,
66
55
edgeMap : number [ ] [ ] ,
67
56
children : number [ ] [ ] ,
68
- parent : ( number | null ) [ ] ,
57
+ ancestorToGrandson : boolean [ ] [ ] ,
69
58
xor : number [ ] ,
70
59
nums : number [ ] ,
71
60
) {
@@ -78,24 +67,22 @@ function bfs(
78
67
const childs = edgeMap [ node ] ;
79
68
if ( childs . length ) {
80
69
for ( const child of childs ) {
81
- if ( ! visited . has ( child ) && parent [ child ] !== node ) {
70
+ if ( ! visited . has ( child ) && ! ancestorToGrandson [ node ] [ child ] ) {
82
71
visited . add ( child ) ;
72
+ children [ node ] . push ( child ) ;
73
+ for ( let i = 0 ; i < nums . length ; i ++ ) {
74
+ ancestorToGrandson [ i ] [ child ] =
75
+ ancestorToGrandson [ i ] [ node ] ;
76
+ }
77
+ ancestorToGrandson [ node ] [ child ] = true ;
83
78
84
- addEdge ( children , node , child ) ;
85
- parent [ child ] = node ;
86
79
temp . push ( child ) ;
87
80
}
88
81
}
89
82
}
90
83
}
91
- bfs ( temp , visited , edgeMap , children , parent , xor , nums ) ;
84
+ bfs ( temp , visited , edgeMap , children , ancestorToGrandson , xor , nums ) ;
92
85
for ( const node of nodes ) {
93
86
xor [ node ] = nums [ node ] ^ children [ node ] . reduce ( ( a , v ) => a ^ xor [ v ] , 0 ) ;
94
87
}
95
88
}
96
-
97
- function addEdge ( edgemap : number [ ] [ ] , a : number , b : number ) {
98
- const arr = edgemap [ a ] ?? [ ] ;
99
- arr . push ( b ) ;
100
- edgemap [ a ] = arr ;
101
- }
0 commit comments