#include <bits/stdc++.h>
#include "grader.h"
using namespace std;
pair<int,int> masLejano(int x, int padre , map<int,vector<int>> &adj)
{
pair<int,int> res = {x, 0}, temp;
for(int i = 0; i < adj[x].size(); i++)
if(adj[x][i] != padre)
{
temp = masLejano(adj[x][i], x, adj);
temp.second++;
if(temp.second > res.second)
res = temp;
}
return res;
}
pair<int,pair<int,int>> diametro(int x, map<int,vector<int>> &adj)
{
pair<int,int> a, b;
a = masLejano(x, x, adj);
b = masLejano(a.first, a.first, adj);
return {b.second, {b.first, a.first}};
}
void seccion(int x, int padre ,int dist, set<int> &vec, map<int,vector<int>> &adj)
{
if(dist < 0)
return ;
vec.insert(x);
for(int i = 0; i < adj[x].size(); i++)
seccion(adj[x][i], x, dist-1, vec, adj);
}
int findEgg (int N, vector < pair < int, int > > bridges)
{
map<int,vector<int>> adj;
if(N == 1)
return 1;
//cout << "-----------\n";
for(int i = 0; i < N-1; i++)
{
adj.insert({bridges[i].first, vector<int> (0)});
adj.insert({bridges[i].second, vector<int> (0)});
adj[bridges[i].first].push_back(bridges[i].second);
adj[bridges[i].second].push_back(bridges[i].first);
}
int ini = bridges[0].first;
while(true)
{
pair<int,pair<int,int>> dmtr = diametro(ini, adj);
set<int> a, b;
int mit = dmtr.first/2;
/*cout << "\n";
cout << dmtr.first << " -> " << dmtr.second.first << " " << dmtr.second.second << "\n";*/
seccion(dmtr.second.first, 0, mit, a, adj);
if(dmtr.first%2 == 1)
mit++;
seccion(dmtr.second.second, 0, mit, b, adj);
//Debo de separar las dos secciones
//Las dos secciones se unen con una arista, la cual debo cortar
int mitad;
for(auto it : a)
if(b.count(it))
{
mitad = it;
b.erase(mitad);
break;
}
int intruso;
for(int i = 0; i < adj[mitad].size(); i++)
if(b.count(adj[mitad][i]))
{
intruso = adj[mitad][i];
adj[mitad].erase(adj[mitad].begin()+i);
for(int j = 0; j < adj[intruso].size(); j++)
if(adj[intruso][j] == mitad)
{
adj[intruso].erase(adj[intruso].begin()+j);
break;
}
break;
}
vector<int> question;
for(auto it : a)
question.push_back(it);
if(query(question))
{
ini = *a.begin();
if(a.size() == 1)
return *a.begin();
}
else
{
ini = *b.begin();
if(b.size() == 1)
return *b.begin();
}
/*for(auto it : a)
cout << it << " ";
cout << " -> ";
for(auto it : b)
cout << it << " ";
cout << "\n";*/
}
}
/*int main()
{
int n, a, b;
cin >> n;
vector<pair<int,int>> vec;
for(int i = 0; i <n-1; i++)
{
cin >> a >> b;
vec.push_back({a, b});
}
findEgg(n, vec);
return 0;
}*/
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |