Submission #1274830

#TimeUsernameProblemLanguageResultExecution timeMemory
1274830mehrzadMigrations (IOI25_migrations)C++17
0 / 100
2 ms656 KiB
#include "migrations.h" #include <vector> #include <algorithm> std::vector<std::vector<int>> adj; std::vector<int> parent; int diameter_u, diameter_v, diameter_dist; std::pair<int, int> bfs_farthest(int start, int n) { std::vector<int> dist(n, -1); std::vector<int> queue; dist[start] = 0; queue.push_back(start); int farthest = start; int max_dist = 0; for (size_t idx = 0; idx < queue.size(); idx++) { int u = queue[idx]; for (int v : adj[u]) { if (dist[v] == -1) { dist[v] = dist[u] + 1; queue.push_back(v); if (dist[v] > max_dist) { max_dist = dist[v]; farthest = v; } } } } return {farthest, max_dist}; } int send_message(int N, int i, int Pi) { if (i == 1) { // Initialize adj.clear(); adj.resize(N); parent.clear(); parent.resize(N); parent[0] = -1; diameter_u = 0; diameter_v = 0; diameter_dist = 0; } // Add edge adj[i].push_back(Pi); adj[Pi].push_back(i); parent[i] = Pi; // Find diameter: BFS from one endpoint, then BFS from farthest point auto [far1, dist1] = bfs_farthest(diameter_u, N); auto [far2, dist2] = bfs_farthest(far1, N); int old_u = diameter_u; int old_v = diameter_v; int old_dist = diameter_dist; diameter_u = far1; diameter_v = far2; diameter_dist = dist2; // Send message only if diameter changed if (diameter_dist > old_dist) { // Encode both endpoints int msg = diameter_u * 10000 + diameter_v; return msg; } return 0; } std::pair<int, int> longest_path(std::vector<int> S) { int last_msg = 0; for (int i = 1; i < (int)S.size(); i++) { if (S[i] > 0) { last_msg = S[i]; } } if (last_msg == 0) { return {0, 0}; } int u = last_msg / 10000; int v = last_msg % 10000; return {u, v}; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...