P8802 [蓝桥杯 2022 国 B] 出差
思路
写最短路时加上点权即可
也可以这样存图直接跑最短路
G[a].push_back({b,len+add[b]});
G[b].push_back({a,len+add[a]});
代码(prim)
#include<iostream>
#include<cstring>
using namespace std;
const int N = 1010, INF = 0x3f3f3f3f;
int g[N][N];
int dist[N];
bool st[N];
int a[N];
int main() {
int n, m;
cin >> n >> m;
memset(g, INF, sizeof g);
memset(dist, INF, sizeof dist);
for (int i = 1; i <= n; i++) cin >> a[i];
while (m--) {
int a, b, c;
cin >> a >> b >> c;
g[a][b] = g[b][a] = c;
}
a[1] = 0;
dist[1] = 0;
for (int i = 1; i <= n; i++) {
int t = -1;
for (int j = 1; j <= n; j++)
if (!st[j] && (t == -1 || dist[t] + a[t] > dist[j] + a[j]))
t = j;
st[t] = true;
for (int j = 1; j <= n; j++) dist[j] = min(dist[j], dist[t] + g[t][j] + a[t]);
}
cout << dist[n] << endl;
return 0;
}