思路是再存一个沿途点权最大值,跑Floyd,没想到会有什么情况不对
#include<bits/stdc++.h>
#define debug cout << "OK" << endl;
#define MAXN int(2e2 + 70)
#define MAXM int(1e4 + 10)
using namespace std;
int dis[MAXN][MAXN], pt[MAXN][MAXN];
int n, m, q;
int main()
{
memset(dis, -1, sizeof(dis));
memset(pt, -1, sizeof(pt));
cin >> n >> m >> q;
for(int i = 1; i <= n; i++)
{
scanf("%d", &pt[i][i]);
dis[i][i] = 0;
}
for(int i = 1; i <= m; i++)
{
int u, v, w;
scanf("%d %d %d", &u, &v, &w);
if(dis[u][v] > w || dis[u][v] == -1)
{
dis[u][v] = dis[v][u] = w;
}
pt[u][v] = pt[v][u] = max(pt[u][u], pt[v][v]);
}
for(int k = 1; k <= n; k++)
{
for(int i = 1; i <= n; i++)
{
if(dis[i][k] == -1)
{
continue;
}
for(int j = 1; j <= n; j++)
{
if(dis[k][j] == -1)
{
continue;
}
if(max(pt[i][k], pt[k][j]) + dis[i][k] + dis[k][j] < pt[i][j] + dis[i][j] || dis[i][j] == -1)
{
dis[i][j] = dis[i][k] + dis[k][j];
pt[i][j] = max(pt[i][k], pt[k][j]);
}
}
}
}
for(int i = 1; i <= q; i++)
{
int u, v;
scanf("%d %d", &u, &v);
printf("%d\n", dis[u][v] + pt[u][v]);
}
return 0;
}