比赛 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;
}