제출 #1201067

#제출 시각아이디문제언어결과실행 시간메모리
1201067AzeTurk810Connecting Supertrees (IOI20_supertrees)C++20
0 / 100
0 ms328 KiB
#include "supertrees.h"
#include <vector>
#include <iostream>

struct DSU {
    std::vector<int> par;
    int n , components;

    DSU(int _n) {
        n = _n;
        components = n;
        par.assign(n , -1);
    }

    int Find(int u) {
        if(par[u] < 0 ) return u;
        return par[u] = Find(par[u]);
    }

    bool Union(int u , int v) {
        u = Find(u);
        v = Find(v);
        if(u != v) {
            components--;
            if(par[u] > par[v]) {
                par[v] += par[u];
                par[u] = v;
                return true;
            }
            par[u] += par[v];
            par[v] = u;
            return true;
        } else {
            return false;
        }
    }
};

int cntt;
std::vector<std::vector<int>> g;
std::vector<bool> used;
std::vector<std::vector<int>> answer;

void dfs(int v , int &ff) {
	used[v] = true;
	cntt++;
	for(auto to : g[v]) {
		if(!used[to]) {
			answer[v][to] = true;
			answer[to][v] = true;
			dfs(to , ff);
			return ;
		}
	}
	if(v != ff) {
		answer[v][ff] = true;
		answer[ff][v] = 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] != p[j][i]) return false;
		}
		
	}
	
	used.assign(n , false);
	g.resize(n);
	answer.assign(n , std::vector<int>(n , false));
	DSU t(n);
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if(p[i][j]) {
				t.Union(i , j);
				g[i].push_back(j);
			}
		}
		
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if(!p[i][j]) {
				if(t.Find(i) == t.Find(j)) return false;
			}
		}
		
	}
	for (int i = 0; i < n; i++)
	{
		if(!used[i] && p[i][i]) {
			cntt = 0;
			dfs(i , i);
			// if(cntt <= 1) {
			// 	return false;
			// }
		} else {
			int cntt = -t.par[t.Find(i)];
			if(!used[i] && cntt > 1) {
				return false;
			}
		}
	}
	for (int i = 0; i < n; i++)
	{
		for (int j = 0; j < n; j++)
		{
			if(answer[i][j] != answer[j][i]) return false;
		}
		
	}
	
	
	build(answer);
	return 1;
}
/*
4
2 0 2 2 
2 0 2 2
2 2 2 2
0 0 0 0

3
2 2 2
2 2 2
2 2 2

3
2 2 0
2 2 0
0 0 0
*/
#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...