有 N� 个村庄,编号 11 到 N�。
村庄之间有 M� 条无向道路,第 i� 条道路连接村庄 ai�� 和村庄 bi��,长度是 ci��。
所有村庄都是连通的。
共有 K� 个村庄有商店,第 j� 个有商店的村庄编号是 xj��。
然后给出 Q� 个询问,第 k� 个询问给出一个村庄的编号 yk��,问该村庄距离最近的商店有多远?
输入格式
第一行包含两个整数 N,M�,�。
接下来 M� 行,每行包含三个整数 ai,bi,ci��,��,��,表示第 i� 条道路连接村庄 ai�� 和村庄 bi��,长度是 ci��。
再一行包含整数 K�。
接下来 K� 行,每行包含一个整数 xj��,表示第 j� 个有商店的村庄编号是 xj��。
再一行包含整数 Q�。
接下来 Q� 行,每行包含一个整数 yk��,表示询问编号为 yk�� 的村庄与其距离最近的商店之间的距离。
输出格式
对于每个询问,输出该询问的结果。
数据范围
2≤N≤1052≤�≤105,
N−1≤M≤min(N(N−1)2,105)�−1≤�≤���(�(�−1)2,105),
1≤Q≤1051≤�≤105,
1≤K≤N1≤�≤�,
1≤ci≤100001≤��≤10000
输入样例:
7 7
1 2 5
1 4 3
2 3 2
2 5 1
3 6 7
5 6 8
6 7 6
3
7
5
4
7
1
2
3
4
5
6
7
输出样例:
3
1
3
0
0
6
0
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
int g[N],ne[3*N],e[3*N],w[3*N],idx,n,m,k,q,inf=0x3f3f3f3f;
bool st[N];
int dist[N];
typedef pair<int ,int > PII;
void add(int a,int b,int c){
e[idx]=b;
w[idx]=c;
ne[idx]=g[a];
g[a]=idx++;
}
void dijkstra(){
memset(dist,inf,sizeof dist);
dist[0]=0;
priority_queue<PII,vector<PII>,greater<PII> > heap;
heap.push({0,0});
while(!heap.empty()){
PII t=heap.top();
heap.pop();
int ver=t.second,distance=t.first;
if(st[ver])
continue;
st[ver]=true;
for(int i=g[ver];i!=-1;i=ne[i]){
int j=e[i];
if(dist[j]>distance+w[i]){
dist[j]=distance+w[i];
heap.push({distance+w[i],j});
}
}
}
}
int main(){
cin>>n>>m;
memset(g,-1,sizeof g);
for(int i=0;i<m;i++){
int x,y,z;
scanf("%d %d %d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
cin>>k;
for(int i=0;i<k;i++){
int e;
scanf("%d",&e);
add(0,e,0);
}
dijkstra();
cin>>q;
while(q--){
int b;
scanf("%d",&b);
printf("%d\n",dist[b]);
}
return 0;
}