제출 #923152

#제출 시각아이디문제언어결과실행 시간메모리
923152AlphaMale06악어의 지하 도시 (IOI11_crocodile)C++14
100 / 100
882 ms104880 KiB
#include<bits/stdc++.h> #include "crocodile.h" using namespace std; using ll = long long; #define F first #define S second #define pb push_back const int mxn = 1e5+10; vector<pair<ll, ll>> adj[mxn]; ll dist[mxn][2]; bool mark[mxn]; int travel_plan(int n, int m, int R[][2], int L[], int K, int P[]) { for(int i=0; i< m; i++){ adj[R[i][0]].pb({R[i][1], L[i]}); adj[R[i][1]].pb({R[i][0], L[i]}); } for(int i=0; i<n; i++)dist[i][0]=dist[i][1]=1e14; set<pair<pair<ll, ll>, ll>> st; for(int i=0; i<K; i++){ int v=P[i]; mark[v]=1; dist[v][0]=dist[v][1]=0; } for(int i=0; i<K; i++){ int v=P[i]; for(auto to : adj[v]){ if(to.S<dist[to.F][0]){ dist[to.F][1]=dist[to.F][0]; dist[to.F][0]=to.S; } else if(to.S<dist[to.F][1]){ dist[to.F][1]=to.S; } } } for(int i=0; i< n; i++)st.insert({{dist[i][1], dist[i][0]}, i}); while(st.size()){ int v = (*st.begin()).S; if(mark[v]){ st.erase((*st.begin())); continue; } mark[v]=1; for(auto to : adj[v]){ if(!mark[to.F]){ if(to.S+dist[v][1]<dist[to.F][0]){ dist[to.F][1]=dist[to.F][0]; dist[to.F][0]=to.S+dist[v][1]; } else if(to.S+dist[v][1]<dist[to.F][1]){ dist[to.F][1]=dist[v][1]+to.S; } st.insert({{dist[to.F][1], dist[to.F][0]}, to.F}); } } } return dist[0][1]; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...