上述代码加入边的权重
时间: 2023-07-02 15:14:20 浏览: 87
cpp代码-SPFA模板
要加入边的权重,可以将邻接表中节点的链表节点定义为一个结构体,包含两个字段:`to` 表示该链表节点指向的节点编号,`w` 表示该链表节点对应的边的权重。具体地,可以按照以下方式修改代码:
```c++
const int MAXN = 100005;
const int INF = 0x3f3f3f3f;
struct Edge {
int to; // 该链表节点指向的节点编号
int w; // 该链表节点对应的边的权重
int nxt; // 指向下一个链表节点的指针
} edges[MAXN];
int head[MAXN]; // 邻接表中每个节点的链表头指针
int tot = 0; // 邻接表中节点的总数
int dist[MAXN]; // 从源点到每个节点的最短路径长度
void add_edge(int u, int v, int w) {
edges[++tot].to = v;
edges[tot].w = w;
edges[tot].nxt = head[u];
head[u] = tot;
}
void dijkstra(int s) {
memset(dist, -1, sizeof(dist));
priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
pq.push(make_pair(0, s));
dist[s] = 0;
while (!pq.empty()) {
pair<int, int> p = pq.top();
pq.pop();
int u = p.second;
if (dist[u] < p.first) continue;
for (int i = head[u]; i; i = edges[i].nxt) {
int v = edges[i].to;
int w = edges[i].w;
if (dist[v] == -1 || dist[v] > dist[u] + w) {
dist[v] = dist[u] + w;
pq.push(make_pair(dist[v], v));
}
}
}
}
```
在这个实现中,`Edge` 结构体表示邻接表中节点的链表节点,包含 `to`、`w` 和 `nxt` 三个字段。其中,`to` 表示该链表节点指向的节点编号,`w` 表示该链表节点对应的边的权重,`nxt` 表示指向下一个链表节点的指针。在 `add_edge` 函数中,每次加入一条从节点 `u` 到节点 `v` 权重为 `w` 的边时,都会新建一个链表节点,并将其插入到节点 `u` 的链表头部。
在 `dijkstra` 函数中,每次遍历节点 `u` 的邻接表时,都会遍历 `u` 的所有邻居节点,并计算从源点 `s` 到每个邻居节点的距离。具体地,遍历邻接表中以节点 `u` 为起点的所有链表节点,获取链表节点对应的邻居节点 `v` 和该链表节点对应的边的权重 `w`。如果源点 `s` 到邻居节点 `v` 的距离还未计算或者存在一条更短的路径,则更新 `dist[v]` 的值,并将节点 `(dist[v], v)` 加入到优先队列中。
阅读全文