#include<cstdio>
#include<cstring>
#include<queue>
#include<vector>
#define INF 0x3f3f3f3f
using namespace std;
struct node1{
int to,next,w;
}e[100010];
struct node{
int a,c,w;
bool operator >(const node &x) const
{
return w>x.w;
}
node(){}
node(int aa,int bb,int cc){
a=aa;
c=bb;
w=cc;
}
};
int cnt,head[100010],S,T,C,n,m,p[1010],d[1010][110];
void add_edge(int from,int to,int w){
e[cnt].to=to;
e[cnt].w=w;
e[cnt].next=head[from];
head[from]=cnt++;
}
int dijkstra(){
priority_queue<node,vector<node>,greater<node> >q;
for(int i=0;i<=n;i++)
for(int j=0;j<=C;j++)
d[i][j]=INF;
int ans=INF;
d[S][0]=0;
q.push(node(S,0,0));
while(!q.empty()){
node k=q.top();
q.pop();
if(k.a == T){
return k.w;
}
if(k.c<C && d[k.a][k.c+1] > d[k.a][k.c] + p[k.a]){
d[k.a][k.c+1]=d[k.a][k.c]+p[k.a];
q.push(node(k.a,k.c+1,d[k.a][k.c+1]));
}
for(int i=head[k.a];i!=-1;i=e[i].next){
if(e[i].w > k.c ) continue;
int t=e[i].to;
if(d[t][k.c-e[i].w] > d[k.a][k.c]){
d[t][k.c-e[i].w]=d[k.a][k.c];
q.push(node(t,k.c-e[i].w,d[t][k.c-e[i].w]));
}
}
}
return ans==INF?-1:ans;
}
int main(){
while(scanf("%d%d",&n,&m) == 2){
memset(head,-1,sizeof(head));
cnt=0;
for(int i=0;i<n;i++) scanf("%d",&p[i]);
for(int i=0;i<m;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
add_edge(a,b,c);
add_edge(b,a,c);
}
int Q;
scanf("%d",&Q);
while(Q--){
scanf("%d%d%d",&C,&S,&T);
int res=dijkstra();
if(~res) printf("%d\n",res);
else printf("impossible\n");
}
}
}
uva 11367 最短路问题 边之间还有其他关系
最新推荐文章于 2019-10-10 21:25:59 发布