Skip to content

Commit 04a300d

Browse files
authored
Update 3203-find-minimum-diameter-after-merging-two-trees.js
1 parent f9e9750 commit 04a300d

File tree

1 file changed

+52
-0
lines changed

1 file changed

+52
-0
lines changed

3203-find-minimum-diameter-after-merging-two-trees.js

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -45,3 +45,55 @@ var minimumDiameterAfterMerge = function (edges1, edges2) {
4545
const radius2 = Math.floor((diameter2 + 1) / 2)
4646
return Math.max(radius1 + radius2 + 1, diameter1, diameter2)
4747
}
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

Comments
 (0)