Submission #1039659

#TimeUsernameProblemLanguageResultExecution timeMemory
1039659DorostWef슈퍼트리 잇기 (IOI20_supertrees)C++17
100 / 100
137 ms32336 KiB
#include "supertrees.h"
#include <bits/stdc++.h>

using namespace std;
const int N = 1032;
vector <int> g1[N], g2[N];
int r1[N], r2[N];
bool vis[N];
vector <int> v[N];

void dfs1 (int v) {
	vis[v] = true;
	for (int u : g1[v]) {
		if (!vis[u]) {
			r1[u] = r1[v];
			dfs1 (u);
		}
	}
}

void dfs2 (int v) {
	vis[v] = true;
	for (int u : g2[v]) {
		if (!vis[u]) {
			r2[u] = r2[v];
			dfs2 (u);
		}
	}
}

int construct(std::vector<std::vector<int>> p) {
	int n = p.size();
	std::vector<std::vector<int>> ans;
	for (int i = 0; i < n; i++) {
		std::vector<int> row;
		row.resize(n);
		ans.push_back(row);
	}
	for (int i = 0; i < n; i++) {
		for (int j = i + 1; j < n; j++) {
			if (p[i][j] == 1) {
				g1[i].push_back(j);
				g1[j].push_back(i);
			} 
			if (p[i][j] >= 1) {
				g2[i].push_back(j);
				g2[j].push_back(i);
			}
		}
	}
	for (int i = 0; i < n; i++) {
		if (!vis[i]) {
			r1[i] = i;
			dfs1(i);
		}
	}
	for (int i = 0; i < n; i++) 
		vis[i] = false;
	for (int i = 0; i < n; i++) {
		if (!vis[i]) {
			r2[i] = i;
			dfs2(i);
		}
	}
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			int w;
			if (r2[i] != r2[j]) {
				w = 0;
			} else if (r1[i] == r1[j]) {
				w = 1;
			} else {
				w = 2;
			}
			if (p[i][j] != w)
				return 0;
		}
	}
	for (int i = 0; i < n; i++) {
		if (r1[i] != i) {
			ans[i][r1[i]] = 1;
			ans[r1[i]][i] = 1;
		} else {
			v[r2[i]].push_back(i);
		}
	}
	for (int i = 0; i < n; i++) {
		if (v[i].size() == 2)
			return 0;
		if (v[i].size() <= 1)
			continue;
		int sz = (int)v[i].size();
		for (int j = 0; j < sz; j++) {
			ans[v[i][j]][v[i][(j + 1) % sz]] = true;
			ans[v[i][(j + 1) % sz]][v[i][j]] = true;
		}
	}
	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...