单源最短路,可以存在负数
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std ;
const int INF = 0x3f3f3f3f ;
const int N = 20010 ;
struct edge{
int a , b , c ;
}e[N];
int t[N] ;
int dis[N] ;
int n , m ;
int main(){
cin >> n >> m ;
for(int i = 1 ; i <= n ;i ++) cin >> t[i] ;
for(int i = 1 ; i <= m ; i ++){
int a, b ,c ;
cin >> a >> b >> c ;
e[i].a = a , e[i].b = b , e[i].c = c ;
e[i+m].a = b , e[i+m].b = a , e[i+m].c = c ;
}
memset(dis,INF ,sizeof(dis)) ;
dis[1] = 0 ;
for(int k = 1 ; k <= n ; k ++){
for(int i = 1 ; i <= 2*m ; i ++){
int u = e[i].a , v = e[i].b ;
int res = t[v] ;
if(v == n) res = 0 ;
dis[v] = min(dis[v],dis[u] + res + e[i].c) ;
}
}
cout << dis[n] << endl ;
}