Submission #414346

#TimeUsernameProblemLanguageResultExecution timeMemory
414346prvocisloSwapping Cities (APIO20_swap)C++17
37 / 100
2058 ms12084 KiB
#include "swap.h" #include <bits/stdc++.h> using namespace std; class dsu { public: vector<int> p, s, ok; // ok - je tento komponent cyklus alebo obsahuje rozvetvenie? int root(int x) { return x == p[x] ? x : p[x] = root(p[x]); } void merge(int a, int b) { a = root(a), b = root(b); if (a == b) return ok[a] = true, void(); // cyklus if (s[a] < s[b]) swap(a, b); p[b] = a; s[a] += s[b]; ok[a] |= ok[b]; } void good(int u) { ok[root(u)] = true; } dsu(int n): p(vector<int>(n)), s(vector<int>(n, 1)), ok(vector<int>(n, false)) { for (int i =0;i<n;i++) p[i] = i; } }; struct edge { int u, v, w; }; bool cmp(edge a, edge b) { return a.w < b.w; } int n, m; vector<edge> e; void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) { n = N, m = M; for (int i = 0; i < m;i++) e.push_back({U[i], V[i], W[i]}); sort(e.begin(), e.end(), cmp); } int getMinimumFuelCapacity(int x, int y) { dsu c(n); vector<int> deg(n, 0); for (int i = 0; i < m; i++) { c.merge(e[i].u, e[i].v); deg[e[i].u]++, deg[e[i].v]++; if (deg[e[i].u] >= 3) c.good(e[i].u); if (deg[e[i].v] >= 3) c.good(e[i].v); if (c.root(x) == c.root(y) && c.ok[c.root(x)]) return e[i].w; } return -1; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...