#include <bits/stdc++.h>
#include "meetings.h"
using namespace std;
int gdzie[2007];
set<int> mozliwe[2007];
int n, ile = 0;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
vector<int> kolejnoc_sciezki(vector<int> cojest, int korz)
{
	if (cojest.size() == 0)
	{
		return {};
	}
	else if (cojest.size() == 1)
	{
		return cojest;
	}
	else if (cojest.size() == 2)
	{
		int odp = Query(korz, cojest[0], cojest[1]);
		if (odp == cojest[0])
		{
			return cojest;
		}
		else
		{
			return { cojest[1], cojest[0] };
		}
	}
	else
	{
		int sr = rng() % cojest.size();
		vector<int> wczesniej;
		vector<int> pozniej;
		for (int i = 0; i < cojest.size(); i++)
		{
			if (i != sr)
			{
				int odp = Query(korz, cojest[sr], cojest[i]);
				if (odp == cojest[sr])
				{
					pozniej.push_back(cojest[i]);
				}
				else
				{
					wczesniej.push_back(cojest[i]);
				}
			}
		}
		wczesniej = kolejnoc_sciezki(wczesniej, korz);
		pozniej = kolejnoc_sciezki(pozniej, korz);
		vector<int> odp = wczesniej;
		odp.push_back(cojest[sr]);
		for (auto x : pozniej)
		{
			odp.push_back(x);
		}
		return odp;
	}
}
void roziwaz(int korz)
{
	if (ile >= n - 1)
	{
		return;
	}
	//cerr << "korzen " << korz << " mozliwe " << mozliwe[korz].size() << endl;
	if (mozliwe[korz].size() == 0)
	{
		return;
	}
	auto it = mozliwe[korz].begin();
	//cerr << "ok" << endl;
	int iledop = rng() % mozliwe[korz].size();
	//cerr << iledop << endl;
	advance(it, iledop);
	int doczego = *it;
	//cerr << "dokad " << doczego << endl;
	vector<int> nasc;
	vector<pair<int, int>> do_usu;
	vector<pair<int, int>> do_dodania;
	for (auto x : mozliwe[korz])
	{
		if (x != doczego)
		{
			int odp = Query(korz, doczego, x);
			//cerr << korz << " " << doczego << " " << x << " " << odp << endl;
			if (odp == x)
			{
				nasc.push_back(x);
				do_usu.push_back({ x, korz });
			}
			else
			{
				do_usu.push_back({ x, gdzie[x] });
				do_dodania.push_back({ x, odp });
			}
		}
		else
		{
			do_usu.push_back({ x, gdzie[x] });
		}
	}
	for (auto x : do_usu)
	{
		if (gdzie[x.first] != -1)
		{
			mozliwe[x.second].erase(x.first);
			gdzie[x.first] = -1;
		}
	}
	for (auto x : do_dodania)
	{
		mozliwe[x.second].insert(x.first);
		gdzie[x.first] = x.second;
	}
	vector<int> sciezka;
	sciezka.push_back(korz);
	vector<int> temp = kolejnoc_sciezki(nasc, korz);
	for (auto x : temp)
	{
		sciezka.push_back(x);
	}
	sciezka.push_back(doczego);
	for (int i = 0; i < sciezka.size() - 1; i++)
	{
		//cerr << sciezka[i] << " " << sciezka[i + 1] << endl;
		if (sciezka[i] > sciezka[i + 1])
		{
			Bridge(sciezka[i + 1], sciezka[i]);
		}
		else
		{
			Bridge(sciezka[i], sciezka[i + 1]);
		}
		ile++;
	}
	for (auto x : sciezka)
	{
		roziwaz(x);
	}
	return;
}
void Solve(int N)
{
	n = N;
	int startowy = rng() % n;
	for (int i = 0; i < n; i++)
	{
		if (i != startowy)
		{
			mozliwe[startowy].insert(i);
			gdzie[i] = startowy;
		}
	}
	roziwaz(startowy);
}
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... | 
| # | Verdict | Execution time | Memory | Grader output | 
|---|
| Fetching results... |