一道不算太水的题吧。
总体来讲是用floyd来做,不过有一个点权就比较讨厌了。
先把点权从小到大排序,然后floyd就好了吧,具体看代码。
其实,这也可以当一个模板吧。
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <cmath>
using namespace std;
int g[255][255],d[255][255],C[255],n,m,k;
struct data
{
int v,id;
}c[255];
bool cmp(data a,data b)
{
return a.v<b.v;
}
void floyd()
{
for (int x=1;x<=n;x++)
{
int k=c[x].id;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
{
d[i][j]=d[j][i]=min(d[i][k]+d[k][j],d[i][j]);
g[i][j]=g[j][i]=min(g[i][j],d[i][j]+max(C[k],max(C[i],C[j])));
}
}
}
int main()
{
freopen("in.txt","r",stdin);
scanf("%d%d%d",&n,&m,&k);
for (int i=1;i<=n;i++)
scanf("%d",&c[i].v),c[i].id=i;
for (int i=1;i<=n;i++)
for (int j=1;j<=n;j++)
if (i!=j) d[i][j]=d[j][i]=g[i][j]=g[j][i]=1e9+10;
else g[i][j]=g[j][i]=c[i].v;
sort(c+1,c+1+n,cmp);
for (int i=1;i<=n;i++)
C[c[i].id]=c[i].v;
for (int i=1;i<=m;i++)
{
int x,y,l;
scanf("%d%d%d",&x,&y,&l);
if (l<d[x][y])
d[x][y]=d[y][x]=l;
}
floyd();
for (int i=1;i<=k;i++)
{
int s,t;
scanf("%d%d",&s,&t);
printf("%d\n",g[s][t]);
}
return 0;
}