加权最短路板子题
#include<bits/stdc++.h>
using namespace std;
#define clr(a) memset(a, 0, sizeof(a))
#define line cout<<"-------------"<<endl
typedef long long ll;
const int maxn = 1e5 + 10;
const int MAXN = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const int MOD = 1e9 + 7;
const int N = 110;
int n, m;
int t[N], dis[N], ans[N];
int mp[N][N];
bool vis[N];
void dij(int st){
ans[st] = t[st];
for(int i = 1; i <= n; i++){
if(mp[st][i] < INF)
ans[i] = ans[st] + t[i];
dis[i] = mp[st][i];
}
dis[st] = 0;
vis[st] = true;
for(int i = 1; i <= n; i++){
int u = 0;
int minn = INF;
for(int j = 1; j <= n; j++){
if(!vis[j] && dis[j] < minn){
minn = dis[j];
u = j;
}
}
vis[u] = true;
for(int k = 1; k <= n; k++){
if(!vis[k] && dis[k] > mp[u][k] + dis[u]){
dis[k] = mp[u][k] + dis[u];
ans[k] = ans[u] + t[k];
}
}
for(int k = 1; k <= n; k++){
if(dis[k] == mp[u][k] + dis[u]){
ans[k] = max(ans[k], ans[u] + t[k]);
}
}
}
if(dis[n] >= INF) printf("impossible");
else printf("%d %d\n", dis[n], ans[n]);
}
int main(){
memset(mp, INF, sizeof(mp));
scanf("%d", &n);
for(int i = 1; i <= n; i++) scanf("%d", &t[i]);
scanf("%d", &m);
int x, y, z;
for(int i = 0; i < m; i++){
scanf("%d%d%d", &x, &y, &z);
if(mp[x][y] > z){
mp[x][y] = z;
mp[y][x] = z;
}
}
dij(1);
return 0;
}