2019.2.15 t2

时间:2023-03-09 18:46:02
2019.2.15 t2

2019.2.15 t2

2019.2.15 t2

考虑倒过来计算最短路径长度,设dis[u]表示在最坏情况下,点u到最近的一 个出口的最短路,则p个出口的dis值都是0,答案即为dis[0]。

 #include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <cctype>
#include <queue>
#include <algorithm>
using namespace std; #define res register int
#define LL long long
#define inf 0x3f3f3f3f
inline int read()
{
int x(),f(); char ch;
while(!isdigit(ch=getchar())) if(ch=='-') f=-;
while(isdigit(ch)) x=x*+ch-'',ch=getchar();
return f*x;
} inline int max(int x,int y){return x>y?x:y;}
inline int min(int x,int y){return x<y?x:y;}
const int N=+;
int n,m,k,d,tot;
int head[N],ver[N<<],nxt[N<<],edge[N<<];
int dis[N],vis[N];
inline void add(int x,int y,int z){
ver[++tot]=y; nxt[tot]=head[x]; head[x]=tot; edge[tot]=z;
}
struct node{
int id;
LL dd;
bool operator<(const node &n2) const {
return dd>n2.dd;}
};
priority_queue<node> q; inline LL dij()
{
while(q.size())
{
node now=q.top(); q.pop();
int x=now.id,z=now.dd;
if(++vis[x]>d+) continue;
if(vis[x]==d+ || !dis[x])
{
dis[x]=z;
for(res i(head[x]) ; i ; i=nxt[i])
{
int y=ver[i];
if(dis[y]==inf)
q.push((node){ver[i],dis[x]+(LL)edge[i]});
}
}
}
} int main()
{
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout); memset(dis,inf,sizeof(dis));
n=read(); m=read(); k=read(); d=read();
for(res i= ; i<=m ; i++)
{
int x=read(),y=read(),z=read();
add(x,y,z); add(y,x,z);
}
for(res i= ; i<=k ; i++)
{
int x=read(); dis[x]=;
q.push((node){x,});
}
dij();
if(dis[]==inf) puts("-1");
else cout<<dis[]<<endl; return ;
}