Submission #1218307

#TimeUsernameProblemLanguageResultExecution timeMemory
1218307brintonConnecting Supertrees (IOI20_supertrees)C++20
21 / 100
133 ms22284 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;

int construct(vector<vector<int>> p) {
	int N = p.size();
	vector<vector<int>> answer(N,vector<int>(N,0));

	
	
	vector<int> gline(N,-1);
	for(int i = 0;i < N;i++) gline[i] = i;
	set<int> cs;
	function<void(int,int)> dfs = [&](int cur,int need){
		cs.insert(cur);
		for(int nxt = 0;nxt < N;nxt++){
			if(nxt == cur) continue;
			if(cs.count(nxt)) continue;
			if(p[nxt][cur] == need){
				dfs(nxt,need);
			}
		}
	};
	auto check = [&](vector<int> &v,int need){
		for(auto &i:v){
			for(auto &j:v){
				if(i == j) continue;
				if(p[i][j] != need) return false;
			}
		}
		return true;
	};
	for(int i = 0;i < N;i++){
		if(gline[i] != i) continue;
		cs.clear();
		dfs(i,1);
		if(cs.size() == 1) continue;
		vector<int> cv(cs.begin(),cs.end());
		if(!check(cv,1)) return 0;
		for(int i = 0;i +1 < cv.size();i++){
			answer[cv[i]][cv[i+1]] = 1;
		}
		for(auto &i:cv) gline[i] = cv[0];
	}
	// build cycle;


	// mirror;
	for(int i = 0;i < N;i++){
		for(int j = 0;j < N;j++){
			answer[i][j] |= answer[j][i];
			answer[j][i] |= answer[i][j];
		}
	}
	build(answer);
	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...