제출 #557203

#제출 시각아이디문제언어결과실행 시간메모리
557203OlympiaDreaming (IOI13_dreaming)C++17
컴파일 에러
0 ms0 KiB
#include <iostream> #include <vector> #include "dreaming.h" #include <climits> #include <queue> #include <map> #include <algorithm> using namespace std; vector<int64_t> a, b, w; vector<vector<int64_t> > adj; map<pair<int64_t,int64_t>,int64_t> myMap; vector<bool> hasVisited; vector<int64_t> parent; pair<int64_t,int64_t> find_farthest_node (int64_t x, bool undo) { queue<pair<int64_t,int64_t> > q; q.push(make_pair(x, 0)); hasVisited[x] = true; parent[x] = -1; vector<int64_t> nodes; vector<pair<int64_t,int64_t> > vec; while (!q.empty()) { pair<int64_t,int64_t> p = q.front(); nodes.push_back(p.first); vec.push_back(make_pair(p.second, p.first)); q.pop(); for (int64_t j: adj[p.first]) { if (!hasVisited[j]) { q.push(make_pair(j, p.second + myMap[make_pair(j, p.first)])); parent[j] = p.first; hasVisited[j] = true; } } } if (undo) { for (int64_t j: nodes) { hasVisited[j] = false; } } sort(vec.begin(), vec.end()); return vec.back(); //first distance, then node } int64_t travelTime (int64_t N, int64_t M, int64_t L, int64_t A[], int64_t B[], int64_t W[]) { a.resize(M), b.resize(M), w.resize(M), adj.resize(N), parent.resize(N); for (int i = 0; i < M; i++) { a[i] = A[i], b[i] = B[i], w[i] = W[i]; myMap[make_pair(a[i], b[i])] = w[i]; myMap[make_pair(b[i], a[i])] = w[i]; adj[a[i]].push_back(b[i]), adj[b[i]].push_back(a[i]); } hasVisited.assign(N, false); vector<int64_t> paths; int64_t ans = 0; for (int i = 0; i < N; i++) { if (!hasVisited[i]) { int64_t x = find_farthest_node(i, true).second; int64_t y = find_farthest_node(x, true).second; vector<int> nodes; int64_t val = y; while (val != -1) { nodes.push_back(val); val = parent[val]; } int64_t sum = 0; for (int j = 1; j < (int) nodes.size(); j++) { sum += myMap[make_pair(nodes[j], nodes[j - 1])]; } ans = max(ans, sum); int64_t c = 0; int64_t myMin = LLONG_MAX; int64_t best = 0; for (int j = 1; j < (int)nodes.size(); j++) { c += myMap[make_pair(nodes[j], nodes[j - 1])]; if (max(c, sum - c) < myMin) { myMin = max(c, sum - c); best = nodes[j]; } } if (nodes.size() == 1) { myMin = 0; } paths.push_back(find_farthest_node(best, false).first); } } sort(paths.begin(), paths.end()); //cout << paths.size() << '\n'; if (paths.size() == 1) { ans = max(ans, paths[0]); } else if (paths.size() == 2) { ans = max(paths.back() + paths[paths.size() - 2] + L, ans); } else { ans = max(paths.back() + paths[paths.size() - 2] + 2 * L, ans); } return ans; } /* int main() { int N = 12; int M = 8; int L = 2; int A[M], B[M], T[M]; A[0] = 0, A[1] = 8, A[2] = 2, A[3] = 5, A[4] = 5, A[5] = 1, A[6] = 1, A[7] = 10; B[0] = 8, B[1] = 2, B[2] = 7, B[3] = 11, B[4] = 1, B[5] = 3, B[6] = 9, B[7] = 6; T[0] = 4, T[1] = 2, T[2] = 4, T[3] = 3, T[4] = 7, T[5] = 1, T[6] = 5, T[7] = 3; cout << travelTime(N, M, L, A, B, T); } */

컴파일 시 표준 에러 (stderr) 메시지

/usr/bin/ld: /tmp/ccyLAlnk.o: in function `main':
grader.c:(.text.startup+0xd1): undefined reference to `travelTime'
collect2: error: ld returned 1 exit status