# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
308957 | 2020-10-02T11:50:05 Z | tengiz05 | 악어의 지하 도시 (IOI11_crocodile) | C++17 | 0 ms | 0 KB |
#include "crocodile.h" #include <bits/stdc++.h> using namespace std; const int inf = 1e9+7; const int NN = 2e5+5; vector<pair<int, int>> edges[NN]; multiset<int> dist[NN]; int travel_plan(int n, int m, int R[][2], int L[], int k, int P[]){ for(int i=0;i<m;i++){ edges[R[i][0]].push_back({R[i][1], L[i]}); edges[R[i][1]].push_back({R[i][0], L[i]}); } set<pair<int, int>> q; for(int i=0;i<k;i++){ dist[P[i]].insert(0); dist[P[i]].insert(0); q.insert({0, P[i]}); }for(int i=0;i<n;i++){ if(dist[i].empty()){ dist[i].insert(inf); dist[i].insert(inf); } } while(!q.empty()){ auto pp = *q.begin();q.erase(pp); int d = pp.first; int u = pp.second; auto dd = dist[u].begin();dd++; int D = *dd; if(D < d)continue; for(auto X : edges[u]){ int v = X.first; int cost = X.second; auto ss = dist[v].begin();ss++; if(D+cost >= *ss)continue; dist[v].erase(dist[v].find(*ss)); dist[v].insert(D + cost); auto s1 = dist[v].begin();s1++; if(*s1 != inf){ q.push({*s1, v}); } } } auto ans1 = dist[0].begin();ans1++; int ans = *ans1; return ans; }