Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit f3512e5

Browse files
author
hasibulislam999
committed
Reachable Nodes in Subdivided Graph problem solved
1 parent d819818 commit f3512e5

File tree

1 file changed

+58
-0
lines changed

1 file changed

+58
-0
lines changed
Lines changed: 58 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,58 @@
1+
/**
2+
* Title: Reachable Nodes in Subdivided Graph
3+
* Description: You are given an undirected graph (the "original graph") with n nodes labeled from 0 to n - 1. You decide to subdivide each edge in the graph into a chain of nodes, with the number of new nodes varying between each edge.
4+
* Author: Hasibul Islam
5+
* Date: 04/05/2023
6+
*/
7+
8+
/**
9+
* @param {number[][]} edges
10+
* @param {number} maxMoves
11+
* @param {number} n
12+
* @return {number}
13+
*/
14+
15+
const initializeGraph = (n) => {
16+
let G = [];
17+
for (let i = 0; i < n; i++) {
18+
G.push([]);
19+
}
20+
return G;
21+
};
22+
const addEdgeWithCostToG = (G, Edges) => {
23+
for (const [u, v, cost] of Edges) {
24+
G[u].push([v, cost]);
25+
G[v].push([u, cost]);
26+
}
27+
};
28+
29+
const reachableNodes = (edges, maxMoves, n) => {
30+
let g = initializeGraph(n);
31+
addEdgeWithCostToG(g, edges);
32+
return dijkstra(g, n, edges, maxMoves);
33+
};
34+
35+
const MIN = Number.MIN_SAFE_INTEGER;
36+
const dijkstra = (g, n, edges, maxMoves) => {
37+
let pq = new MaxPriorityQueue({ priority: (x) => x[0] });
38+
let blood = Array(n).fill(MIN); // for each node, save maximum moves left to reach each node
39+
pq.enqueue([maxMoves, 0]);
40+
let res = 0;
41+
while (pq.size()) {
42+
let [hp, cur] = pq.dequeue().element;
43+
if (blood[cur] != MIN) continue;
44+
blood[cur] = hp;
45+
res++;
46+
for (const [next_node, cost] of g[cur]) {
47+
let next_hp = hp - cost - 1; // cut the cost for move to adjacent child
48+
if (next_hp < 0 || blood[next_node] != MIN) continue;
49+
pq.enqueue([next_hp, next_node]);
50+
}
51+
}
52+
for (const [u, v, cost] of edges) {
53+
let uv = blood[u] == MIN ? 0 : blood[u];
54+
let vu = blood[v] == MIN ? 0 : blood[v];
55+
res += Math.min(cost, uv + vu);
56+
}
57+
return res;
58+
};

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /