제출 #1353473

#제출 시각아이디문제언어결과실행 시간메모리
1353473ChottuF슈퍼트리 잇기 (IOI20_supertrees)C++20
100 / 100
204 ms22280 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;

struct DSU{
    vector<int> parent, sz;
    DSU(int n){
        sz.resize(n,1);
        parent.resize(n);
        for (int i = 0; i<n; i++){
            parent[i] = i;
        }
    }
    int find(int x){
        if (x == parent[x]) return x;
        return parent[x] = find(parent[x]);
    }
    bool merge(int a, int b){
        a = find(a);
        b = find(b);
        if (a == b) return false;
        if (sz[a] < sz[b]) swap(a,b);
        parent[b] = a;
        sz[a] += sz[b];
        return true;
    }
};



int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	
	for (int i = 0; i<n; i++){
	    for (int j = 0; j<n; j++){
	        if (p[i][j] == 3) return 0;
	    }
	}
	
	vector<vector<int>> b(n, vector<int>(n));
	
	//
	DSU cc(n);
	DSU one(n);
	for (int i = 0; i<n; i++){
	    for (int j = i+1; j<n; j++){
	        if (p[i][j] > 0) cc.merge(i, j);
	        if (p[i][j] == 1) one.merge(i,j);
	    }
	}
	vector<vector<int>> comps(n), ckk(n);
	for (int i = 0; i<n; i++){
	    int d = cc.find(i);
	    comps[d].push_back(i);
	    
	    int xx = one.find(i);
	    ckk[xx].push_back(i);
	}
	for (int i = 0; i<n; i++){
	    int sz = comps[i].size();
	    for (int j = 0; j<sz; j++){
	        for (int k = j+1; k<sz; k++){
	            int u = comps[i][j];
	            int v = comps[i][k];
	            if (p[u][v] == 0) return 0;
	        }
	    }
	    
	    int sz1 = ckk[i].size();
	    for (int j = 0; j<sz1; j++){
	        for (int k = j+1; k<sz1; k++){
	            int u = ckk[i][j];
	            int v = ckk[i][k];
	            
	            
	            if (p[u][v] == 2 || p[u][v] == 0) return 0;
	            
	            
	            //check p[j] == p[k]
	            for (int l = 0; l<n; l++){
	                if (p[u][l] != p[v][l]) return 0;
	            }
	        }
	    }
	}
	
	for (int i = 0; i<n; i++){
	    int d = one.find(i);
	    if (d != i){
	        b[d][i] = 1;
	        b[i][d] = 1;
	    }
	}
	
	for (int i = 0; i<n; i++){
	    int sz = comps[i].size();
	    
	    vector<int> all;
	    for (int j = 0; j<sz; j++){
	        int dd = one.find(comps[i][j]);
	        all.push_back(dd);
	    }
	    sort(all.begin(), all.end());
	    all.erase(unique(all.begin(),all.end()), all.end());
	    
	    if (all.size() <= 1) continue;
	    if (all.size() == 2) return 0;
	    
	    for (int j = 0; j<all.size()-1; j++){
	        int aa = all[j];
	        int bb = all[j+1];
	        b[aa][bb] = 1;
	        b[bb][aa] = 1;
	    }
	    b[all.back()][all[0]] = 1;
	    b[all[0]][all.back()] = 1;
	}
	build(b);
	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...