题目链接
分析
单源最短路问题,建图后计算出所有节点最短路径,节点最短路径的最大值即为答案
使用链式前向星存图,用 Dijkstra 算法计算每个节点的最短路长度
最后,取最大值即可(如最大值是 $\infty$ 代表有节点无法到达,返回 $-1$ 即可
代码实现
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
const int MAXN = 6010;
int head[105], nxt[MAXN], weight[MAXN], to[MAXN], idx = 0;
memset(head, -1, sizeof(head));
for(auto &v : times)
{
nxt[idx] = head[v[0]];
to[idx] = v[1];
weight[idx] = v[2];
head[v[0]] = idx++;
}
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;
vector<bool> isVis(n + 1, false);
vector<int> dis(n + 1, INT_MAX);
pq.emplace(0, k);
dis[k] = 0, dis[0] = 0; // 将未使用的位设为 0,防止计算最大值出错
while(!pq.empty())
{
auto [d, u] = pq.top();
pq.pop();
if(isVis[u])
continue;
isVis[u] = true;
for(int i = head[u]; ~i; i = nxt[i])
{
int t = d + weight[i];
if(t < dis[to[i]])
{
dis[to[i]] = t;
pq.emplace(t, to[i]);
}
}
}
int ans = ranges::max(dis);
return ans < INT_MAX ? ans : -1;
return 0;
}
};
复杂度分析
- 时间复杂度:$O(m \log m)$,$m$ 为 $times$ 的长度,由于堆中可能有相同节点,最坏情况即 $times$ 中路径均进入堆中
- 空间复杂度:$O(m)$