天天看点

HDU 2066 一个人的旅行(最短路)

#include<bits/stdc++.h>
using namespace std;

#define min(a,b) (a<b?a:b)
#define pqg(a) priority_queue<a,vector<a>,greater<a> > 
#define MEM(a,b,start,end) for(int ii=start;ii<=end;ii++) a[ii]=b;
#define AddEdge2(u,v,len) edge[tot].to=v,edge[tot].len=len,edge[tot].next=head[u],head[u]=tot++ 
typedef pair<int,int> P; 
const int maxn=100000+100;
const int INF=0x3f3f3f3f;

struct Edge{
  
  int to,next,len;
}edge[maxn<<1];
int head[maxn],tot,dis[maxn]; 
bool to[maxn],vis[maxn];

inline int Dijkstra(){
  
  MEM(dis,INF,1,maxn-1);
  MEM(vis,false,1,maxn-1);
  dis[maxn-1]=0;
  pqg(P) que;
  que.push(P(0,maxn-1));
  int Min=INF;
  while(!que.empty()){
    
    P p=que.top();
    que.pop();
    int u=p.second;
    if(vis[u]) continue;
    vis[u]=true;
    if(to[u]) Min=min(Min,dis[u]);
    for(int i=head[u];i!=-1;i=edge[i].next){
      
      Edge e=edge[i];
      int v=e.to;
      if(!vis[v] && dis[v]>dis[u]+e.len){
        
        dis[v]=dis[u]+e.len;
        que.push(P(dis[v],v));
      }
    }
  } 
  return Min;
}

int main(){
  
  int t,s,d;
  while(scanf("%d%d%d",&t,&s,&d)==3){
    
    MEM(head,-1,1,maxn-1);
    MEM(to,false,1,maxn-1);
    tot=0;
    for(int i=1;i<=t;i++){
      
      int u,v,len;
      scanf("%d%d%d",&u,&v,&len);
      AddEdge2(u,v,len);
        AddEdge2(v,u,len); 
    }
    for(int i=1;i<=s;i++){
      
      int u,v=maxn-1,len=0;
      scanf("%d",&u);
      AddEdge2(u,v,len);
      AddEdge2(v,u,len);
    }
    for(int i=1;i<=d;i++){
      
      int v;
      scanf("%d",&v);
      to[v]=true;
    }
    printf("%d\n",Dijkstra());
  }
}