#include <bits/stdc++.h>
#define MAX 3000005
using namespace std;
int N,M,K;
struct edge
{
    int nod;
    long long len;
};
class cmp
{
public:
    bool operator()(edge a,edge b)
    {
        return a.len>b.len;
    }
};
vector<edge>G[MAX];
priority_queue<edge,vector<edge>,cmp>pq;
long long dist1[MAX],dist2[MAX];
int node1[MAX],node2[MAX];
void read(int N,int M,int R[][2],int L[],int K,int P[])
{
    while(M--)
    {
        int nod1,nod2,len;
        nod1=R[M][0];
        nod2=R[M][1];
        len=L[M];
        ++nod1;
        ++nod2;
        G[nod1].push_back({nod2,len});
        G[nod2].push_back({nod1,len});
    }
    int i;
    for(i=1;i<=N;++i)
        dist1[i]=dist2[i]=1e18;
    while(K--)
    {
        int nod;
        nod=P[K];
        ++nod;
        dist1[nod]=dist2[nod]=0;
        pq.push({nod,0});
    }
}
void djikstra()
{
    while(!pq.empty())
    {
        int nod=pq.top().nod;
        long long len=pq.top().len;
        pq.pop();
        if(len>dist2[nod])
            continue;
        for(auto per : G[nod])
        {
            int nod2=per.nod;
            long long len2=per.len;
            if(dist2[nod2]>len+len2)
            {
                if(dist1[nod2]>len+len2)
                {
                    if(node1[nod2]!=nod){
                    dist2[nod2]=dist1[nod2];
                    dist1[nod2]=len+len2;
                    node2[nod2]=node1[nod2];
                    node1[nod2]=nod;
                    if(dist2[nod2]<1e18)
                    pq.push({nod2,dist2[nod2]});
                    }
                    else{
                    dist1[nod2]=len+len2;
                    node1[nod2]=nod;
                    }
                }
                else
                if(node1[nod2]!=nod){
                    dist2[nod2]=len+len2;
                    node2[nod2]=nod;
                    if(dist2[nod2]<1e18)
                    pq.push({nod2,dist2[nod2]});
                }
            }
        }
    }
}
int travel_plan(int N,int M,int R[][2],int L[],int K,int P[])
{
    read(N,M,R,L,K,P);
    djikstra();
    return dist2[1];
}
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict  | Execution time | Memory | Grader output | 
|---|
| Fetching results... |