제출 #1172510

#제출 시각아이디문제언어결과실행 시간메모리
1172510hyakup슈퍼트리 잇기 (IOI20_supertrees)C++20
100 / 100
122 ms22248 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;

int construct(vector<vector<int>> p) {
	int n = p.size();
	vector<vector<int>> adj(n, vector<int>(n));
	vector<int> pai(n), comp[n];
	iota( pai.begin(), pai.end(), 0 );
	for( int i = 0; i < n; i++ ) comp[i].push_back(i);

	function<int(int)> find = [&]( int a ){ return (( a == pai[a]) ? a : pai[a] = find(pai[a]) ); };

	auto join = [&]( int a, int b ){
		a  = find(a); b = find(b);
		if( a == b ) return 1;
		pai[b] = a;
		adj[a][b] = 1;
		adj[b][a] = 1;

		int ok = 1;
		for( int i : comp[a] ) for( int j : comp[b] ) if( p[i][j] != 1 ) ok = 0;
		for( int i : comp[b] ) comp[a].push_back(i);

		return ok;
	};


	for( int i = 0; i < n; i++ ) for( int j = i + 1; j < n; j++ ) if( (p[i][j] == 1 && !join( i, j )) || p[i][j] == 3 ) return 0;

	vector<int> marc(n);

	for( int i = 0; i < n; i++ ) if( pai[i] == i && !marc[i] ){
		queue<int> fila; fila.push(i);
		vector<int> ciclo;
		marc[i] = true;
		while( !fila.empty() ){
			int cur = fila.front(); fila.pop();
			ciclo.push_back(cur);
			for( int j = 0; j < n; j++ ) if( pai[j] == j && !marc[j] && p[cur][j] == 2 ) fila.push(j), marc[j] = true;
		}

		if( ciclo.size() < 2 ) continue;
		if( ciclo.size() == 2 ) return 0;

		for( int j = 0; j < ciclo.size(); j++ ) for( int k = j + 1; k < ciclo.size(); k++ )
			for( int a : comp[ciclo[j]] ) for( int b : comp[ciclo[k]] ) if( p[a][b] != 2 ) return 0;

		for( int i = 0; i + 1 < ciclo.size(); i++ ) adj[ciclo[i]][ciclo[i + 1]] = adj[ciclo[i + 1]][ciclo[i]] = 1;
		adj[i][ciclo.back()] = adj[ciclo.back()][i] = 1;
	}

	build(adj);

	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...