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
| class Solution { public: int encode(int u, int v, int n) { return u * n + v; }
int reachableNodes(vector<vector<int>>& edges, int maxMoves, int n) { vector<vector<pair<int, int>>> adList(n); for (auto &edge : edges) { int u = edge[0], v = edge[1], nodes = edge[2]; adList[u].emplace_back(v, nodes); adList[v].emplace_back(u, nodes); }
unordered_map<int, int> used; unordered_set<int> visited; int reachableNodes = 0; priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq; pq.emplace(0, 0); while (!pq.empty() && pq.top().first <= maxMoves) { auto [step, u] = pq.top(); pq.pop(); if (visited.count(u)) { continue; } visited.emplace(u); reachableNodes++; for (auto [v, nodes] : adList[u]) { if (nodes + step + 1 <= maxMoves && !visited.count(v)) { pq.emplace(nodes + step + 1, v); } used[encode(u, v, n)] = min(nodes, maxMoves - step); } }
for (auto &edge : edges) { int u = edge[0], v = edge[1], nodes = edge[2]; reachableNodes += min(nodes, used[encode(u, v, n)] + used[encode(v, u, n)]); } return reachableNodes; } };
|