Dijkstra
题目:
LeetCode 743. 网络延迟时间。给定无负边图,求信号从某一源点散播到所有点的最短时间。
分析:
单源最短路问题,这里用Dijkstra算法实现。有几个注意点:优先队列调用的>需要用友元函数,参数为const xx&;优先队列波认为大根堆。另外这里选用链式前向星存图。
代码:
const int MAXE = 6010;
const int MAXV = 110;
const int inf = 0x3f3f3f3f;
struct edge {
int from, to, weight, next;
};
struct QNode {
int v, dis;
QNode(int v_, int dis_) :v(v_), dis(dis_) {}
friend bool operator < (const QNode& lhs, const QNode& rhs) {
return lhs.dis > rhs.dis;
}
};
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
for (auto time : times) {
int u = time[0], v = time[1], weight = time[2];
add_edge(u, v, weight);
}
memset(dis, inf, sizeof(dis));
priority_queue<QNode> queue;
queue.push(QNode(k, 0));
dis[k] = 0;
while (!queue.empty()) {
QNode q = queue.top();
queue.pop();
if (vis[q.v])
continue;
vis[q.v] = 1;
dis[q.v] = q.dis;
for (int i = head[q.v]; i; i = edges[i].next) {
if (!vis[edges[i].to]) {
queue.push(QNode(edges[i].to, q.dis + edges[i].weight));
}
}
}
int ma = 0;
for (int i = 1;i <= n;i++) {
if (dis[i] == inf) {
ma = -1;
break;
}
else {
ma = max(ma, dis[i]);
}
}
return ma;
}
int head[MAXV], tot, vis[MAXV], dis[MAXV];
edge edges[MAXE];
void add_edge(int u, int v, int weight) {
edges[++tot] = { u,v,weight,head[u] };
head[u] = tot;
}
};
标签:
代码模板
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 记一次.NET内存居高不下排查解决与启示
· DeepSeek 开源周回顾「GitHub 热点速览」
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了