P9650 [SNCPC2019] Escape Plan
liaoxingrui · · 题解
Content
给你一个
现在问到达任意出口的距离最短是多少,若不能到达,则输出 -1。
Solution
因为它有
接下来我们考虑
Code
#include<bits/stdc++.h>
#define p pair<int,int>
#define m(x,y) make_pair(x,y)
#define now next[i].x
#define vall next[i].val
using namespace std;
const int N=1e5+5;
const int M=3e6+5;
int t,n,m,k,x,y,z,tot;
int d[N],out[N],dis[N],head[N];
bool flag[N];
priority_queue<p,vector<p>,greater<p> > a;
struct node{
int x,y,val;
}next[M];
inline void add(int x,int y,int z){
tot++;
next[tot].x=y;
next[tot].y=head[x];
next[tot].val=z;
head[x]=tot;
}
inline void dijkstra(){
while(!a.empty()){
int x=a.top().second,val=a.top().first;
a.pop();
if(d[x]){
d[x]--;
continue;
}
if(flag[x])
continue;
flag[x]=true;
dis[x]=val;
for(int i=head[x];i;i=next[i].y)
if(!flag[now])
a.push(m(val+vall,now));
}
}
signed main(){
cin>>t;
while(t--){
cin>>n>>m>>k;
for(int i=1;i<=n;i++){
dis[i]=-1;
head[i]=flag[i]=0;
}
for(int i=1;i<=k;i++){
cin>>out[i];
dis[out[i]]=0;
a.push(m(0,out[i]));
}
for(int i=1;i<=n;i++)
cin>>d[i];
for(int i=1;i<=k;i++)
d[out[i]]=0;
while(m--){
cin>>x>>y>>z;
add(x,y,z);
add(y,x,z);
}
dijkstra();
cout<<dis[1]<<endl;
}
return 0;
}