|
| 1 | +import { BinaryHeap } from "https://deno.land/std@0.165.0/collections/binary_heap.ts"; |
| 2 | +export default function findTheCity( |
| 3 | + n: number, |
| 4 | + edges: number[][], |
| 5 | + distanceThreshold: number |
| 6 | +): number { |
| 7 | + const dc: [number, number][][] = new Array(n).fill(0).map(() => []); |
| 8 | + const has: number[][] = Array(n) |
| 9 | + .fill(0) |
| 10 | + .map(() => Array(n).fill(distanceThreshold + 1)); |
| 11 | + const heap = new BinaryHeap<[number, number, number]>( |
| 12 | + (a, b) => a[0] - b[0] |
| 13 | + ); |
| 14 | + |
| 15 | + for (const [from, to, weight] of edges) { |
| 16 | + if (weight <= distanceThreshold) { |
| 17 | + dc[from].push([to, weight]); |
| 18 | + dc[to].push([from, weight]); |
| 19 | + heap.push([weight, from, to]); |
| 20 | + has[from][to] = has[to][from] = weight; |
| 21 | + } |
| 22 | + } |
| 23 | + for (let i = 0; i < n; i++) has[i][i] = 0; |
| 24 | + |
| 25 | + while (!heap.isEmpty()) { |
| 26 | + const [x, a, b] = heap.pop() as [number, number, number]; |
| 27 | + |
| 28 | + loop(b, x, a); |
| 29 | + loop(a, x, b); |
| 30 | + } |
| 31 | + let minx = -1, |
| 32 | + mnum = n + 1; |
| 33 | + |
| 34 | + for (let x = n - 1; x >= 0; x--) { |
| 35 | + const tep = has[x].filter((i) => i <= distanceThreshold).length; |
| 36 | + if (tep < mnum) { |
| 37 | + minx = x; |
| 38 | + mnum = tep; |
| 39 | + } |
| 40 | + } |
| 41 | + return minx; |
| 42 | + |
| 43 | + function loop(b: number, x: number, a: number) { |
| 44 | + for (const [i, j] of dc[b]) { |
| 45 | + const r = j + x; |
| 46 | + if (r < has[i][a]) { |
| 47 | + heap.push([r, i, a]); |
| 48 | + has[i][a] = has[a][i] = r; |
| 49 | + } |
| 50 | + } |
| 51 | + } |
| 52 | +} |
0 commit comments