Submission #1152998

#TimeUsernameProblemLanguageResultExecution timeMemory
1152998AlgorithmWarriorCrocodile's Underground City (IOI11_crocodile)C++20
100 / 100
436 ms141672 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]; 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 timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...