Submission #1246938

#TimeUsernameProblemLanguageResultExecution timeMemory
1246938TurkhuuSwapping Cities (APIO20_swap)C++20
17 / 100
2095 ms6368 KiB
#include "swap.h"
#include <bits/stdc++.h>
#define FOR(i, a, b) for (auto i = (a); i <= (b); i++)
#define ROF(i, a, b) for (auto i = (a); i >= (b); i--)
using namespace std;
int N, M;
vector<array<int, 3>> edges;
void init(int _N, int _M, std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    N = _N, M = _M;
    FOR(i, 0, M - 1) edges.push_back({W[i], U[i], V[i]});
    sort(edges.begin(), edges.end());
}
int getMinimumFuelCapacity(int X, int Y) {
    vector<int> deg(N), par(N), node(N, 1), edge(N);
    FOR(i, 0, N - 1) par[i] = i;
    function<int(int)> find = [&](int x) {
        return par[x] == x ? x : par[x] = find(par[x]);
    };
    auto unite = [&](int x, int y) {
        if ((x = find(x)) == (y = find(y))) {edge[x]++; return;}
        if (node[x] > node[y]) swap(x, y);
        par[x] = y, node[y] += node[x], edge[y] += edge[x] + 1;
    };
    for (auto [w, x, y] : edges) {
        deg[x]++, deg[y]++;
        unite(x, y);
        if (find(X) != find(Y)) continue;
        int z = find(X);
        if (edge[z] >= node[z]) return w;
        FOR(i, 0, N - 1) if (deg[i] >= 3 && find(i) == z) return 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...