# | Submission time | Handle | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
292683 | 2020-09-07T11:44:17 Z | Haunted_Cpp | Simurgh (IOI17_simurgh) | C++17 | 0 ms | 0 KB |
#include "simurgh.h" #include <bits/stdc++.h> using namespace std; vector<vector<pair<int, int>>> g(MAX_N); bitset<MAX_N> vis; vector<int> span, par, s, best_way, u, v; int n; void reset() { for (int i = 0; i < n; i++) { par[i] = i; s[i] = 1; } } int root(int x) { if (x == par[x]) return x; return par[x] = root(par[x]); } void join(int a, int b) { a = root(a); b = root(b); if (a == b) return; if (s[a] < s[b]) swap(a, b); par[b] = a; s[a] += s[b]; } bool is(int a, int b) { return root(a) == root(b); } bool works() { for (auto to : span) { const int st = u[to]; const int et = v[to]; if (is(st, et)) return false; join(st, et); } return true; } const int MAX_N = 240 + 5; void get_any(int node) { vis[node] = 1; for (auto [nxt, to] : g[node]) { if (!vis[nxt]) { vis[nxt] = 1; span.emplace_back(to); get_any(nxt); } } } vector<int> find_roads(int n, vector<int> u, vector<int> v) { ::n = n; ::u = u; ::v = v; const int m = v.size(); const int t = n - 1; par = s = vector<int>(n); for (int i = 0; i < m; i++) { const int st = u[i]; const int et = v[i]; g[st].emplace_back(et, i); g[et].emplace_back(st, i); } get_any(0); int score = count_common_roads(span); if (score == t) { return span; } for (auto &edge : span) { int starting_edge = edge; bool swap = false; for (int i = 0; i < m; i++) { reset(); edge = i; if(!works()) { continue; } int nxt_score = count_common_roads(span); if (nxt_score > score) { score = nxt_score; assert(edge == i); swap = true; break; } } if (score == t) { return span; } if (!swap) { edge = starting_edge; } } return span; }