Submission #289765

#TimeUsernameProblemLanguageResultExecution timeMemory
289765ivan24Game (IOI14_game)C++14
42 / 100
1053 ms1656 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
using ll = int;
typedef vector<ll> vi;
typedef vector<vi> vvi;
typedef pair<ll,ll> ii;
typedef vector<ii> vii;
typedef vector<vii> vvii;
#define F first
#define S second

const ll INF = 1e9;

ll max(ll x, ll y){
    return ((x > y) ? x : y);
}
ll min(ll x, ll y){
    return ((x < y) ? x : y);
}

class UnionFind {
private:
    ll n, connected_cnt;
    vi sz,p;
public:
    UnionFind(){}
    UnionFind (ll n): n(n), sz(n,1), p(n), connected_cnt(n){
        for (ll i = 0; n > i; i++) p[i] = i;
    }
    ll root (ll x){
        if (p[x] != x) p[x] = root(p[x]);
        return p[x];
    }
    void unify (ll x, ll y){
        x = root(x), y = root(y);
        if (x == y) return;
        if (sz[x] < sz[y]) swap(x,y);
        p[y] = x; sz[x] += sz[y];
        connected_cnt--;
    }
    ll get_connected_cnt(){
        return connected_cnt;
    }
};

class Solver{
private:
    ll n;
    vvi adjMatrix;
    UnionFind uf;
    bool isUnited(){
        queue<ll> q;
        vi isVisited(n,0);
        q.push(0); isVisited[0] = 1;
        while (!q.empty()){
            ll v = q.front(); q.pop();
            for (ll i = 0; n > i; i++){
                if (adjMatrix[v][i] && !isVisited[i]){
                    isVisited[i] = 1; q.push(i);
                }
            }
        }
        for (ll i = 0; n > i; i++)
            if (!isVisited[i]) return false;
        return true;
    }
    void setEdge(ll u, ll v, ll val){
        adjMatrix[u][v] = val;
        adjMatrix[v][u] = val;
    }
public:
    Solver(){}
    Solver(ll n): n (n), adjMatrix(n,vi(n,-1)){
        uf = UnionFind(n);
    }
    ll hasEdge(ll u, ll v){
        setEdge(u,v,0);
        if (!isUnited()){
            setEdge(u,v,1);
            return 1;
        }else return 0;
    }
};

Solver mySolver;

void initialize(int n) {
    mySolver = Solver(n);
}

int hasEdge(int u, int v) {
    return mySolver.hasEdge(u,v);
}

Compilation message (stderr)

game.cpp: In constructor 'UnionFind::UnionFind(ll)':
game.cpp:25:11: warning: 'UnionFind::p' will be initialized after [-Wreorder]
   25 |     vi sz,p;
      |           ^
game.cpp:24:11: warning:   'll UnionFind::connected_cnt' [-Wreorder]
   24 |     ll n, connected_cnt;
      |           ^~~~~~~~~~~~~
game.cpp:28:5: warning:   when initialized here [-Wreorder]
   28 |     UnionFind (ll n): n(n), sz(n,1), p(n), connected_cnt(n){
      |     ^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...