比赛 |
202110省实验桐柏一中普及组联赛 |
评测结果 |
WWWWWWWWWW |
题目名称 |
旅游纪念 |
最终得分 |
0 |
用户昵称 |
tb_hzm |
运行时间 |
0.337 s |
代码语言 |
C++ |
内存使用 |
7.45 MiB |
提交时间 |
2021-10-18 19:19:12 |
显示代码纯文本
#include <cstdio>
#include <vector>
#include <queue>
#include <algorithm>
#include <cstring>
#define min(a, b) ((a) < (b) ? (a) : (b))
#define INF 0x3f3f3f3f
#define MAXN 100005
using namespace std;
struct node {
int p, dis;
node(int _p = 0, int _dis = 0) : p(_p), dis(_dis) {} ;
};
vector <node> g[MAXN];
int n, m, fmx[MAXN], minc[MAXN], val[MAXN], x, y, z;
void dfs(int pred, int pt, int fa, int ndt) {
if(fmx[pt] != INF)
return ;
if(pt == 1)
fmx[pt] = 0;
else {
minc[pt] = min(minc[fa], val[pt]);
fmx[pt] = min(fmx[fa], ndt - val[pt] + minc[pt]) + g[fa][pred].dis;
}
for(int i = 0; i < g[pt].size(); i++)
dfs(i, g[pt][i].p, pt, ndt + g[pt][i].dis);
return ;
}
int main() {
memset(fmx, INF, sizeof fmx);
freopen("keepsake.in", "r", stdin);
freopen("keepsake.out", "w", stdout);
scanf("%d %d", &n, &m);
for(int i = 1; i <= m; i++) {
scanf("%d %d %d", &x, &y, &z);
g[x].push_back(node(y, z));
}
for(int i = 1; i <= n; i++)
scanf("%d", val + i);
dfs(0, 1, 0, 0);
printf("%d", fmx[n]);
return 0;
}