Submission #1190412

#TimeUsernameProblemLanguageResultExecution timeMemory
1190412Br3adSwapping Cities (APIO20_swap)C++20
37 / 100
2094 ms8124 KiB
#include <iostream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <functional>
#include <numeric>
#include <cstring>
#include <string>
#include <cmath>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>

using namespace std;
#define ll long long
#define ull unsigned long long
#define f first
#define s second
#define PF push_front
#define PB push_back
#define MP make_pair

#define all(v) v.begin(), v.end()
#define rall(v) v.rbegin(), v.rend()

#define max(a, b) ((a > b)? a : b)
#define min(a, b) ((a < b)? a : b)
#define max3(a, b, c) max(max(a, b), c)
#define min3(a, b, c) min(min(a, b), c)

const int N = 1e5 + 5;
const int M = 1e9 + 7; 
const int inf = 0x3f3f3f3f;
const ll int INF = 1e18;

struct DSU{
    vector<int> parent, edge_cnt;
    vector<bool> swappable;

    DSU(int n){
        parent = vector<int>(n+1);
        iota(all(parent), 0);

        edge_cnt = vector<int>(n+1, 0);
        swappable = vector<bool>(n+1, false);
    }

    int find_parent(int p){
        return (parent[p] == p)? p : parent[p] = find_parent(parent[p]);
    }

    void merge(int a, int b){
        int pa = find_parent(a);
        int pb = find_parent(b);
        edge_cnt[a]++;
        edge_cnt[b]++;

        // Degree >= 3
        if(edge_cnt[a] >= 3) swappable[pa] = true;
        if(edge_cnt[b] >= 3) swappable[pb] = true;

        // Contains cycle
        if(pa == pb) swappable[pb] = true;

        parent[pa] = pb;
        if(swappable[pa]) swappable[pb] = true;
    }

    bool check(int a, int b){
        int pa = find_parent(a);
        int pb = find_parent(b);
        return (pa == pb && swappable[pa]);
    }
};

int _n, _m;
vector<tuple<int, int, int>> edge;
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++) edge.PB({w[i], u[i], v[i]});
    sort(all(edge));
}

int getMinimumFuelCapacity(int x, int y){
    DSU dsu(_n);
    for(int i = 0; i < _m; i++){
        auto [w, u, v] = edge[i];
        dsu.merge(u, v);
        if(dsu.check(x, y)) return w;
    }
    return -1;
}

// int main(){
//     
//     ios::sync_with_stdio(false);
//     cin.tie(NULL);
//     
//     // ifstream cin();
//     // ofstream cout();
//     
//     vector<int> u = {0, 0, 1, 1, 1, 2};
//     vector<int> v = {1, 2, 2, 3, 4, 3};
//     vector<int> w = {4, 4, 1, 2, 10, 3};
//     init(5, 6, u, v, w);
// 
//     int ans1 = getMinimumFuelCapacity(1, 2);
//     int ans2 = getMinimumFuelCapacity(2, 4);
//     int ans3 = getMinimumFuelCapacity(0, 1);
//     cout << ans1 << endl << ans2 << endl << ans3 << endl;
//     
// }
#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...