Submission #483490

#TimeUsernameProblemLanguageResultExecution timeMemory
483490rc_catuntaConnecting Supertrees (IOI20_supertrees)C++14
19 / 100
212 ms24056 KiB
#include "supertrees.h"
#include <vector>
#include <iostream>
#include <unordered_map>
using namespace std;

vector<int> rep,rnk;

void init(int N){
	rep.assign(N,0);
	for(int i=0;i<N;i++){
		rep[i]=i;
	}
	rnk.assign(N,1);
}

int buscar(int a){
	if(rep[a]==a) return a;
	return rep[a]=buscar(rep[a]);
}

bool mismo_conjunto(int a,int b){
	return buscar(a)==buscar(b);
}

void unir(int a,int b){
	int ra=buscar(a);
	int rb=buscar(b);
	if(ra != rb){
		if(rnk[ra]>rnk[rb]){
			rep[rb]=ra;
		}
		else{
			rep[ra]=rb;
		}
	}
}

int construct(vector<vector<int> > p) {
	int n = p.size();
	vector<vector<int> > answer;
	answer.assign(n,vector<int>(n));
	// Creamos el Union Find
	init(n);
	// Recorremos p
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(p[i][j]==2){
				unir(i,j);
			}
		}
	}
	// Verificar si p es correcto, si existe un grafo que lo satisfaga
	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(mismo_conjunto(i,j) and p[i][j]==0){
				return 0;
			}
		}
	}
	// Si p es valido
	unordered_map<int,vector<int> >conjuntos;
	for(int i=0;i<rep.size();i++){
		int ri = buscar(i);
		if(conjuntos.find(ri)!=conjuntos.end()){
			conjuntos[ri].push_back(i);
		}
		else{
			conjuntos[ri] = vector<int>();
			conjuntos[ri].push_back(i);
		}
	}
	for(auto elem: conjuntos){
		vector<int> cont = elem.second;
		if(cont.size()==1) continue;
		if(cont.size()==2) return 0;
		for(int i=0;i<cont.size();i++){
			int na = cont[i];
			int nb = cont[(i+1)%cont.size()];
			answer[na][nb]=1;
			answer[nb][na]=1;
		}
	}
	// Imprimiendo
	/* for(auto elem: conjuntos){
		int llave = elem.first;
		vector<int> cont = elem.second;
		cout<<llave<<": ";
		for(auto x: cont){
			cout<<x<<" ";
		}
		cout<<endl;
	}*/
	build(answer);
	return 1;
}

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:63:15: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   63 |  for(int i=0;i<rep.size();i++){
      |              ~^~~~~~~~~~~
supertrees.cpp:77:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   77 |   for(int i=0;i<cont.size();i++){
      |               ~^~~~~~~~~~~~
#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...