This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
int pa[1600];
int sz[1600];
int N;
vector<int> E[1600];
set<int> D[1600];
bool vis[1600];
int find(int x){
if( x == pa[x] ) return x;
return pa[x] = find(pa[x]);
}
void uni(int a, int b){
a = find(a); b = find(b);
if( a == b ) return;
sz[a] += sz[b];
pa[b] = a;
}
void initialize(int n) {
for(int i=0;i<n;i++) pa[i] = i, sz[i] = 1;
N = n;
}
int dfs(int x){
int ret = 1;
vis[x] = 1;
for(int i=0;i<N;i++) if( !vis[i] && D[x].count(i) == 0 ){
ret += dfs(i);
}
return ret;
}
int hasEdge(int u, int v) {
// 1. u,v 가 이미 같은 component면 잇는다
if( find(u) == find(v) ){
E[u].push_back(v); E[v].push_back(u);
return 1;
}
// 2. (u,v)를 잇고 나머지를 다 끊어도 connected면 끊는다
if( sz[find(u)] + sz[find(v)] == N ){
D[u].insert(v); D[v].insert(u);
return 0;
}
for(int i=0;i<N;i++) vis[i] = 0;
// 3. (u,v)를 끊고 나머지를 다 이어도 disconnected면 잇는다
D[u].insert(v); D[v].insert(u);
if( dfs(1) < N ){
D[u].erase(v); D[v].erase(u);
E[u].push_back(v); E[v].push_back(u);
uni(u,v);
return 1;
}
// 4. 다 아니면 끊는다 (random 으로 바꿔볼만 한가?)
//E[u].push_back(v); E[v].push_back(u);
//uni(u,v);
D[u].insert(v); D[v].insert(u);
return 0;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |