# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
399253 | 2021-05-05T13:33:44 Z | fvogel499 | 악어의 지하 도시 (IOI11_crocodile) | C++14 | 0 ms | 0 KB |
#include <iostream> #include <vector> #include <queue> #include <algorithm> using namespace std; #define pii pair<int, int> #define siz 100000/1000 #define inf 10e9 // #define int long long int dist [siz]; int secondDist [siz]; bool proc [siz]; struct Compare { bool operator()(int a, int b) { return (secondDist[a] > secondDist[b]); } }; int travel_plan(int nbNodes, int nbEdges, int* corridors [2], int* travelTime, int nbExits, int* exits) { vector<vector<pii>> graph(nbNodes); for (int i = 0; i < nbEdges; i++) { graph[corridors[i][0]].push_back(pii(corridors[i][1], travelTime[i])); graph[corridors[i][1]].push_back(pii(corridors[i][0], travelTime[i])); } for (int i = 0; i < nbNodes; i++) { dist[i] = inf; secondDist[i] = inf; proc[i] = false; } priority_queue<int, vector<int>, Compare> q; for (int i = 0; i < nbExits; i++) { q.push(exits[i]); dist[exits[i]] = 0; secondDist[exits[i]] = 0; } while (!q.empty()) { int curNode = q.top(); q.pop(); if (proc[curNode]) continue; proc[curNode] = true; for (pii newEdge : graph[curNode]) { int newNode = newEdge.first; int newWeight = newEdge.second; int newDist = secondDist[curNode]+newWeight; if (proc[newNode] or newDist > secondDist[newNode]) continue; if (newDist <= dist[newNode]) { secondDist[newNode] = dist[newNode]; dist[newNode] = newDist; } else if (newDist <= secondDist[newNode]) { secondDist[newNode] = newDist; } else { cerr << "ISSUE-1"; } q.push(newNode); } } int maxDist = 0; for (int i = 0; i < nbNodes; i++) { maxDist = max(maxDist, secondDist[i]); } return maxDist; } // int32_t main() { // int nbNodes, nbEdges; // cin >> nbNodes >> nbEdges; // simul // vector<vector<int>> corridors(nbEdges, vector<int>(2)); // for (int i = 0; i < nbEdges; i++) cin >> corridors[i][0] >> corridors[i][1]; // simul // vector<int> travelTime(nbEdges); // for (int i = 0; i < nbEdges; i++) cin >> travelTime[i]; // simul // int nbExits; // cin >> nbExits; // vector<int> exits(nbExits); // for (int i = 0; i < nbExits; i++) cin >> exits[i]; // cout << travel_plan(nbNodes, nbEdges, corridors, travelTime, nbExits, exits); // }