제출 #1326363

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

int construct (vector< vector <int> > modalitati)
{
	const int numar_noduri = (int)modalitati.size();
	vector < vector <int> > adiacenta(numar_noduri , vector <int> (numar_noduri));
	vector <bool> vizitat(numar_noduri);
	vector <int> ramas;

	for (int inceput = 0 ; inceput < numar_noduri ; inceput++)
	{
		if (vizitat[inceput])
			{ continue; }

		vector <int> luat;
		for (int candidat = inceput ; candidat < numar_noduri ; candidat++)
		{
			if (modalitati[inceput][candidat] != 1)
				{ continue; }

			bool gasit = false;
			for (int indice = 0 ; indice < numar_noduri ; indice++) {
				if (gasit |= (modalitati[inceput][indice] != modalitati[candidat][indice]))
					{ break; }
			}
			
			if (!gasit)
				{ luat.push_back(candidat); vizitat[candidat] = true; }
			else
				{ return 0; }
		}

		bool gasit[2] = { };
		for (int nod = 0 ; nod < numar_noduri ; nod++) {
			if (modalitati[inceput][nod] != 1) {
				gasit[0] |= (modalitati[inceput][nod] == 2);
				gasit[1] |= (modalitati[inceput][nod] == 3);
			}
		}

		if (gasit[0] && gasit[1])
			{ return 0; }

		for (int indice = 0 ; indice + 1 < (int)luat.size() ; indice++)
			{ adiacenta[luat[indice]][luat[indice + 1]] = adiacenta[luat[indice + 1]][luat[indice]] = 1; }

		ramas.push_back(inceput);
	}

	vizitat.flip();
	for (int indice = 0 ; indice < (int)ramas.size() ; indice++)
	{
		int& nod = ramas[indice];
		if (vizitat[nod])
			{ continue; }

		int dorit = 0;
		vector <int> luat = {nod};
		for (int __indice = indice + 1 ; __indice < (int)ramas.size() ; __indice++) {
			if (modalitati[nod][ramas[__indice]])
				{ luat.push_back(ramas[__indice]); dorit = modalitati[nod][ramas[__indice]]; }
		}

		for (auto& __nod : luat)
			{ vizitat[__nod] = true; }

		if (luat.size() == 1)
			{ continue; }

		if (luat.size() == 2)
			{ return 0; }

		if (luat.size() == 3 && dorit == 3)
			{ return 0; }

		for (auto& __nod : luat) {
			for (int __indice = 0 ; __indice < numar_noduri ; __indice++) {
				if (modalitati[nod][__indice] != 1 && modalitati[__nod][__indice] != 1 && modalitati[nod][__indice] != modalitati[__nod][__indice])
					{ return 0; }
			}
		}

		for (int __indice = 0 ; __indice + 1 < (int)luat.size() ; __indice++) 
			{ adiacenta[luat[__indice]][luat[__indice + 1]] = adiacenta[luat[__indice + 1]][luat[__indice]] = 1; }

		adiacenta[luat[0]][luat.back()] = adiacenta[luat.back()][luat[0]] = 1;

		if (dorit == 3)
			{ adiacenta[luat[0]][luat[2]] = adiacenta[luat[2]][luat[0]] = 1; }
	}
	
	build(adiacenta);
	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...