@@ -45,3 +45,55 @@ var minimumDiameterAfterMerge = function (edges1, edges2) {
45
45
const radius2 = Math . floor ( ( diameter2 + 1 ) / 2 )
46
46
return Math . max ( radius1 + radius2 + 1 , diameter1 , diameter2 )
47
47
}
48
+
49
+ // another
50
+
51
+ /**
52
+ * @param {number[][] } edges1
53
+ * @param {number[][] } edges2
54
+ * @return {number }
55
+ */
56
+ var minimumDiameterAfterMerge = function ( edges1 , edges2 ) {
57
+ const [ d1 , i , j ] = diameter ( edges1 ) ;
58
+ const [ d2 , ii , jj ] = diameter ( edges2 ) ;
59
+ return Math . max ( d1 , d2 , Math . floor ( ( d1 + 1 ) / 2 ) + Math . floor ( ( d2 + 1 ) / 2 ) + 1 ) ;
60
+ function farthest ( G , i ) {
61
+ const n = G . length ;
62
+ const bfs = [ i ] ;
63
+ const seen = new Array ( n ) . fill ( 0 ) ;
64
+ seen [ i ] = 1 ;
65
+ let res = - 1 ;
66
+ let maxd = - 1 ;
67
+ for ( let k = 0 ; k < bfs . length ; k ++ ) {
68
+ const node = bfs [ k ] ;
69
+ for ( let j = 0 ; j < G [ node ] . length ; j ++ ) {
70
+ const neighbor = G [ node ] [ j ] ;
71
+ if ( seen [ neighbor ] === 0 ) {
72
+ seen [ neighbor ] = seen [ node ] + 1 ;
73
+ bfs . push ( neighbor ) ;
74
+ if ( seen [ neighbor ] > maxd ) {
75
+ res = neighbor ;
76
+ maxd = seen [ neighbor ] ;
77
+ }
78
+ }
79
+ }
80
+ }
81
+ return [ res , maxd - 1 ] ;
82
+ }
83
+
84
+ function diameter ( edges ) {
85
+ if ( edges . length === 0 ) {
86
+ return [ 0 , 0 , 0 ] ;
87
+ }
88
+ const n = edges . length + 1 ;
89
+ const G = Array . from ( { length : n } , ( ) => [ ] ) ;
90
+ for ( let k = 0 ; k < edges . length ; k ++ ) {
91
+ const [ i , j ] = edges [ k ] ;
92
+ G [ i ] . push ( j ) ;
93
+ G [ j ] . push ( i ) ;
94
+ }
95
+ let [ v1 , d ] = farthest ( G , 0 ) ;
96
+ [ v1 , d ] = farthest ( G , v1 ) ;
97
+ return [ d , v1 , v1 ] ;
98
+ }
99
+ } ;
0 commit comments