제출 #1368521

#제출 시각아이디문제언어결과실행 시간메모리
1368521DangerNoodle7591슈퍼트리 잇기 (IOI20_supertrees)C++20
100 / 100
93 ms26124 KiB
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define N 1005
#define ins insert


vector<int> grub[N];
int cev[N][N];
int dolu[N];
int father[N],sze[N];


int dsu(int x){
	if(father[x]==x)return x;
	return father[x]=dsu(father[x]);
}
void kardes(int x,int y){
	x=dsu(x);y=dsu(y);
	if(x==y)return;
	cev[x][y]=1;
	cev[y][x]=1;
	//adj[x].pb(y);
	//adj[y].pb(x);
	if(sze[x]<sze[y])swap(x,y);
	sze[x]+=sze[y];
	father[y]=x;
}


void build(vector<vector<int>> _b);
int construct(vector<vector<int>> p) {
	int n=p.size();
	for(int i=0;i<=n;i++){
		for(int j=0;j<=n;j++)cev[i][j]=0;
		dolu[i]=0;
		grub[i].clear();
		father[i]=i;
		sze[i]=1;
	}
	//clearlari yap

	for(int i=0;i<n;i++){
		for(int j=0;j<n;j++){
			if(p[i][j]==1)kardes(i,j);
			if(p[i][j]==3)return 0;
		}
	}
	for(int i=0;i<n;i++){
		grub[dsu(i)].pb(i);
		for(int j=0;j<n;j++){
			if(dsu(i)==dsu(j)&&p[i][j]!=1)return 0;
		}
	}


	for(int k=0;k<n;k++){
		if(dsu(k)!=k)continue;
		if(dolu[k])continue;
		for(auto u:grub[k]){
			dolu[u]=1;
		}
		set<int> iki;

		
		for(int j=0;j<n;j++){
			if(p[k][j]==2)iki.ins(dsu(j));
		}
		if(iki.size()==0)continue;
		if(iki.size()==1)return 0;

		vector<vector<int>> grublar;
		set<int> hepsi,var;
		for(int i=0;i<n;i++){
			hepsi.ins(i);
		}
		grublar.pb(grub[k]);
		for(auto u:iki)grublar.pb(grub[u]);

		for(int a=0;a<grublar.size();a++){
			for(int b=a+1;b<grublar.size();b++){
				for(auto u:grublar[a]){
					for(auto uu:grublar[b]){
						if(p[uu][u]!=2)return 0;
						if(hepsi.find(u)!=hepsi.end())hepsi.erase(u);
						if(hepsi.find(uu)!=hepsi.end())hepsi.erase(uu);
						var.ins(u);
						var.ins(uu);
					}
				}

			}
		}


		set<int> norm;

		for(auto u:grub[k])norm.ins(u);

		for(auto u:var){
			dolu[u]=1;
			//cout<<u<<" ";
			for(auto uu:hepsi){
				if(p[u][uu]!=0)return 0;
			}
		}
		iki.ins(k);	
		vector<int> v;
		for(auto u:iki)v.pb(u);
		int m=v.size();
		for(int i=0;i<m;i++){
			cev[v[i]][v[(i+1+m)%m]]=1;
			cev[v[(i+1+m)%m]][v[i]]=1;
		}
		


	}

	vector<vector<int>> answer;
	for(int i=0;i<n;i++){
		vector<int> row;
		for(int j=0;j<n;j++){
			row.pb(cev[i][j]);
		}
		//cout<<endl;
		answer.pb(row);
	}
	build(answer);
	return 1;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…