Submission #1312902

#TimeUsernameProblemLanguageResultExecution timeMemory
1312902JohanConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
263 ms77256 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
const int N = 2e3 + 4;
bool vis[N];
vector < int > adj[N];
vector < int > par;
vector < vector < int > > np;
int find(int u){
	if(par[u] < 0)
		return u;
	else return par[u] = find(par[u]);
}
void uni(int u, int v){
	u = find(u);
	v = find(v);
	if(u == v)return;
	par[u] += par[v];
	par[v] = u;
}
void dfs(int s, int u, vector < vector < int > > &ans){
	np[s][u]++;
	vis[u] = true;
	for(auto v : adj[u]){
		if(!vis[v])dfs(s, v, ans);
	}
	vis[u] = false;
}
void create(vector < vector < int > > ans, int n){
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(ans[i][j] > 0){
				adj[i].push_back(j);
//				adj[j].push_back(i);
			}
		}
	}
	for(int u = 0; u < n; u++){
		for(int v = 0; v < n; v++)
			vis[v] = false;
		dfs(u, u, ans);
	}
}
void reset_all(int n) {
  np.assign(n, vector<int>(n, 0));
	par.assign(n, -1);
	for(int i = 0; i < n; i++) {
		adj[i].clear();
		vis[i] = false;
	}
}
int construct(vector < vector < int > > p){
	int n = p.size();
	reset_all(n);
	set < int > lnn[n];
	vector < int > ln[n];
	map < int, map < int , int > > cnt;
	for(int i = 0; i < n; i++){
		vector < int > v1, v2;
		for(int j = 0; j < n; j++){
			if(p[i][j] >= 1 && i != j){
				uni(i, j);
				cnt[i][p[i][j]]++;
				if(p[i][j] == 1){
					ln[i].push_back(j);
					lnn[i].insert(j);
				}
			}	
		}
	}	
	set < int > v;
	vector < int > g[n];
	int q = 0;
	for(int i = 0; i < n; i++){
		v.insert(find(i));
		g[find(i)].push_back(i);
		q += ln[i].size() == 0;
	}
	vector < vector < int > > ans(n, vector < int > (n, 0));
	for(auto pre : v){
		vector < int > cycle;
		for(auto i : g[pre]){
			if(cnt[i][2] == g[pre].size() - 1)
				cycle.push_back(i);
		}
		for(int i = 0; i < (int)cycle.size() - 1; i++){
			int u = cycle[i];
			int v = cycle[i + 1];
			ans[u][v] = ans[v][u] = 1;
		}
//		for(auto i : cycle)cout << i << ' ';cout << endl;
		map < int , int > vis;
		int lst = ((int)cycle.size() == 0 ? -1 : cycle.back());
		int bgn = ((int)cycle.size() == 0 ? -1 : cycle.back());
		for(auto i : g[pre]){
			if(cnt[i][2] == g[pre].size() - 1 || vis[i])
				continue;
			vector < int > cur = {i};
			for(auto j : ln[i]){
				cur.push_back(j);
				vis[j] = 1;
			}
			if(bgn == -1)bgn = cur[0];
			if(lst != -1)ans[lst][cur[0]] = ans[cur[0]][lst] = 1;
			for(int j = 0; j < cur.size() - 1; j++){
				int u = cur[j];
				int v = cur[j + 1];
				ans[u][v] = ans[v][u] = 1;
			}
			lst = cur[0];
		}
		if((int)cycle.size() > 0 && lst != cycle[0])
			ans[lst][cycle[0]] = ans[cycle[0]][lst] = 1;
		else if((int)cycle.size() == 0 && bgn != -1 && lst != -1 && bgn != lst){
			ans[bgn][lst] = ans[lst][bgn] = 1;
		}
	} 
	if(q == n){
		create(ans, n);
		bool ok = true;
		for(int i = 0; i < n; i++){
			for(int j = 0; j < n; j++)
				ok &= (p[i][j] == np[i][j]);
		}
		if(!ok)
			return 0;
		build(ans);
		return 1;
	}
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++){
			if(find(i) != find(j))continue;
			if(lnn[i].count(j) || i == j )np[i][j] = 1;
			else np[i][j] = 2;
		}
	}
	bool ok = true;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)
			ok &= (p[i][j] == np[i][j]);
	}
	if(!ok)
		return 0;
	for(int i = 0; i < n; i++)
		for(int j = 0; j < n; j++)
			np[i][j] = 0;
	create(ans, n);
	ok = true;
	for(int i = 0; i < n; i++){
		for(int j = 0; j < n; j++)
			ok &= (p[i][j] == np[i][j]);
	}
	if(!ok)
		return 0;
	build(ans);
	return 1;
}
/*
7
1 1 1 2 2 2 2
1 1 1 2 2 2 2
1 1 1 2 2 2 2
2 2 2 1 2 1 2
2 2 2 2 1 2 1
2 2 2 1 2 1 2
2 2 2 2 1 2 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...