Submission #434661

#TimeUsernameProblemLanguageResultExecution timeMemory
43466179brueConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
295 ms26692 KiB
#include "supertrees.h"
#include <bits/stdc++.h>

using namespace std;

struct unionFind{
    int par[1002];
    void init(int n){
        for(int i=0; i<n; i++) par[i] = i;
    }
    int find(int x){
        if(x == par[x]) return x;
        return par[x] = find(par[x]);
    }
    void merge(int x, int y){
        x = find(x), y = find(y);
        par[x] = y;
    }
} uf1, uf2;

int n;
int mat[1002][1002];
vector<vector<int> > ans;
vector<int> degreeTwos[1002];
bool inCycle[1002];
int oneRoot[1002];

int construct(vector<vector<int>> _p){
	int n = _p.size();
	uf1.init(n);
	uf2.init(n);
	for(int i=0; i<n; i++) oneRoot[i] = -1;
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            mat[i][j] = _p[i][j];
            if(mat[i][j] == 3) return 0;

            if(mat[i][j] == 1) uf1.merge(i, j);
            if(mat[i][j] == 1 || mat[i][j] == 2) uf2.merge(i, j);
        }
    }

    ans.resize(n);
    for(int i=0; i<n; i++) ans[i].resize(n);

    /// 트리 만들기
    for(int i=0; i<n; i++){
        if(i != uf1.find(i)) continue;
        for(int j=0; j<n; j++){
            if(i == uf1.find(j) && j != i) ans[i][j] = ans[j][i] = 1;
        }
        degreeTwos[uf2.find(i)].push_back(i);
    }

    /// 사이클 만들기
    for(int i=0; i<n; i++){
        if(i != uf2.find(i) || (int)degreeTwos[i].size() <= 1) continue;
        if((int)degreeTwos[i].size() == 2) return 0;
        for(int j = 0; j < (int)degreeTwos[i].size() - 1; j++){
            ans[degreeTwos[i][j]][degreeTwos[i][j+1]] = 1;
            ans[degreeTwos[i][j+1]][degreeTwos[i][j]] = 1;
        }
        ans[degreeTwos[i].front()][degreeTwos[i].back()] = 1;
        ans[degreeTwos[i].back()][degreeTwos[i].front()] = 1;
    }

    /// 올바른지 확인하기
    for(int i=0; i<n; i++){
        for(int j=0; j<n; j++){
            if(uf1.find(i) == uf1.find(j)){
                if(mat[i][j] != 1) return 0;
            }
            else if(uf2.find(i) == uf2.find(j)){
                if(mat[i][j] != 2) return 0;
            }
            else{
                if(mat[i][j] != 0) return 0;
            }
        }
    }

    build(ans);
    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...