记录编号 584760 评测结果 AAAAAAAAAAA
题目名称 [GXOI/GZOI2019]旅行者 最终得分 100
用户昵称 Gravatar黄天宇 是否通过 通过
代码语言 C++ 运行时间 8.172 s
提交时间 2023-11-14 21:06:12 内存使用 39.11 MiB
显示代码纯文本
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int t;
inline int read()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0' && ch<='9')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
const int M=1e6+7;
priority_queue<pair<int,int> > que;
int n,m,k;
long long ans;
long long minx;
int head[M];
int num;
int d[M];
bool bb[M];
bool flag[M];
long long dis[M];
struct qwe{
    int next;
    int to;
    long long w;
}e[M];
void add(int from,int to,int w){
    num++;
    e[num].next=head[from];
    e[num].to=to;
    e[num].w=w;
    head[from]=num;
}
bool b[M];
int y,z;
long long dijstra(int a){
    while(!que.empty()) que.pop();
    memset(dis,0x3f,sizeof(dis));
    memset(b,0,sizeof(b));
    dis[a]=0;
    que.push(make_pair(0,a));
    while(!que.empty()){
        int x=que.top().second;
        if(flag[x]&&x!=a) return dis[x];
        que.pop();
        if(!b[x]){
            b[x]=1;
            for(int i=head[x];i!=0;i=e[i].next){
                y=e[i].to;
                z=e[i].w;
                if(dis[y]>dis[x]+z){
                    dis[y]=dis[x]+z;
                    que.push(make_pair(-dis[y],y));
                }
            }
        }
    }
    return 0x3f3f3f3f;
}
int main(){
    freopen("WAW.in","r",stdin);
    freopen("WAW.out","w",stdout);
    cin>>t;
    while(t--){
        memset(flag,0,sizeof(flag));
        memset(head,0,sizeof(head));
        num=0;
        n=read(),m=read(),k=read();
        for(int i=1;i<=m;i++){
            int u,v,z;
            u=read(),v=read(),z=read();
            if(u==v) continue;
            add(u,v,z);
        }
        minx=0x3f3f3f3f;
        for(int i=1;i<=k;i++){
            d[i]=read();
            flag[d[i]]=1;
        }
        for(int i=1;i<=k;i++){ 
        long long ans=dijstra(d[i]);         
        minx=min(minx,ans);
        }
        cout<<minx<<endl;
    }
    return 0;
}