-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathstructy-064-longestPath.js
106 lines (80 loc) · 2.19 KB
/
structy-064-longestPath.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
// https://structy.net/problems/premium/longest-path
// p: graph
// r: num+
// dfs: recursion: WITH MEMOIZATION
const longestPath = (graph) => {
let max = -Infinity;
const memo = {};
for (const node in graph) {
node in memo
? (max = Math.max(memo[node], max))
: (max = Math.max(explore(graph, node, memo), max));
}
return max;
};
const explore = (graph, node, memo) => {
if (graph[node].length === 0) return 0;
let max = -Infinity;
for (const neighbor of graph[node]) {
max = Math.max(1 + explore(graph, neighbor, memo), max);
}
memo[node] = max;
return memo[node];
};
// // dfs: recursion: WITHOUT MEMOIZATION
// const longestPath = (graph) => {
// let max = -Infinity;
// for (const node in graph) {
// max = Math.max(explore(graph, node), max);
// }
// return max;
// };
// const explore = (graph, node) => {
// if (graph[node].length === 0) return 0;
// let max = -Infinity;
// for (const neighbor of graph[node]) {
// max = Math.max(1 + explore(graph, neighbor), max);
// }
// return max;
// };
// // bfs
// const longestPath = (graph) => {
// let max = -Infinity;
// for (let node in graph) {
// const queue = [[node, 0]];
// while (queue.length > 0) {
// const [current, distance] = queue.shift();
// for (const neighbor of graph[current]) {
// queue.push([neighbor, distance + 1]);
// }
// max = Math.max(distance, max);
// }
// }
// return max;
// };
// const longestPath = (graph) => {
// const map = {};
// let count = 0;
// for (let node in graph) {
// if (node in map) continue;
// const stack = [node];
// while (stack.length > 0) {
// const current = stack.pop();
// for (const neighbor of graph[current]) {
// stack.push(neighbor);
// // count++;
// map[node] = (map[node] || 0) + 1;
// }
// }
// // map[node] = Math.max(map[node] || -Infinity, count);
// }
// // return count;
// return map;
// };
const graph = {
a: ["c", "b"],
b: ["c"],
c: [],
};
// -> 2
console.log(longestPath(graph));