题意
给出一张图,每条边和点有自己的权值,求从一个点出发到其它点再回来的最小代价(路径加上终点的点权)。
思路
设d表示这个点出发的答案,一开始都是在自己的点上,所以初值是自己的点权,然后跑最短路求解。
代码
#include <queue>
#include <cstdio>
std::queue<int> q;
int n, m, tot;
int head[200001], ver[400001], next[400001], edge[400001], v[200001], d[200001];
void add(int u, int v, int w) {
ver[++tot] = v;
next[tot] = head[u];
edge[tot] = w;
head[u] = tot;
}
void spfa() {
while (q.size()) {
int u = q.front();
q.pop();
v[u] = 0;
for (int i = head[u]; i; i = next[i])
if (d[u] + edge[i] < d[ver[i]]) {
d[ver[i]] = d[u] + edge[i];
if (!v[ver[i]]) {
v[ver[i]] = 1;
q.push(ver[i]);
}
}
}
}
int main() {
scanf("%d %d", &n, &m);
for (int i = 1, x, y, z; i <= m; i++)
scanf("%d %d %d", &x, &y, &z), add(x, y, z * 2), add(y, x, z * 2);
for (int i = 1; i <= n; i++)
scanf("%d", &d[i]), q.push(i);
spfa();
for (int i = 1; i <= n; i++)
printf("%d ", d[i]);
}