# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
1152929 | AlgorithmWarrior | 악어의 지하 도시 (IOI11_crocodile) | C11 | 0 ms | 0 KiB |
#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];
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)
{
dist2[nod2]=dist1[nod2];
dist1[nod2]=len+len2;
}
else
dist2[nod2]=len+len2;
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];
}