比赛 |
近期练习题回顾 |
评测结果 |
AAAAAAAAAA |
题目名称 |
过路费 |
最终得分 |
100 |
用户昵称 |
梦那边的美好ET |
运行时间 |
0.888 s |
代码语言 |
C++ |
内存使用 |
14.18 MiB |
提交时间 |
2018-10-18 11:51:53 |
显示代码纯文本
#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
#include<cstdio>
using namespace std;
int n,m,f[260][260],a1,a2,a3,ans[260][260],a[260],q;
struct hs{int s,x;}b[260];
bool bk(hs b1,hs b2){return b1.s<b2.s;}
int main(){
freopen("toll.in","r",stdin);
freopen("toll.out","w",stdout);
scanf("%d%d%d",&n,&m,&q);
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
if(i!=j)
f[i][j]=ans[i][j]=999999;
for(int i=1;i<=n;i++){scanf("%d",&a[i]);b[i].s=a[i];b[i].x=i;}
for(int i=1;i<=m;i++){
scanf("%d%d%d",&a1,&a2,&a3);
f[a1][a2]=min(f[a1][a2],a3);
f[a2][a1]=f[a1][a2];
}
sort(b+1,b+1+n,bk);
for(int k=1;k<=n;k++)
for(int i=1;i<=n;i++)
for(int j=1;j<=n;j++)
f[i][j]=min(f[i][j],f[i][b[k].x]+f[b[k].x][j]),ans[i][j]=min(ans[i][j],f[i][j]+max(max(a[i],a[j]),a[b[k].x]));
while(q--){
scanf("%d%d",&a1,&a2);
printf("%d\n",ans[a1][a2]);
}
return 0;
}