# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
1146397 | crispxx | Easter Eggs (info1cup17_eastereggs) | C++20 | 0 ms | 0 KiB |
#include <bits/stdc++.h>
#include "grader.h"
#include "grader.cpp"
using namespace std;
#define all(x) x.begin(), x.end()
#define pb push_back
#define nl '\n'
int findEgg(int n, vector <pair<int, int>> edges) {
vector<set<int>> adj(n);
for(auto &[u, v] : edges) {
u--, v--;
adj[u].emplace(v);
adj[v].emplace(u);
}
vector<int> isl;
auto dfs = [&](auto &&dfs, int v, int p) -> void {
isl.pb(v + 1);
for(auto to : adj[v]) {
if(to == p) continue;
dfs(dfs, to, v);
}
};
vector<int> used(n);
while(true) {
bool flag = false;
for(auto [u, v] : edges) {
if(used[u] || used[v]) continue;
adj[u].erase(v);
adj[v].erase(u);
dfs(dfs, u, -1);
auto isl1 = isl;
isl.clear();
dfs(dfs, v, -1);
auto isl2 = isl;
isl.clear();
int x = isl1.size(), y = isl2.size();
if((x == (n + 1) / 2 && y == n / 2) || (x == n / 2 && y == (n + 1) / 2)) {
if(query(isl1)) {
if((int)isl1.size() == 1) {
return isl1[0];
}
for(auto i : isl2) {
used[i - 1] = true;
n--;
}
} else {
if((int)isl2.size() == 1) {
return isl2[0];
}
for(auto i : isl1) {
used[i - 1] = true;
n--;
}
}
flag = true;
break;
}
}
if(!flag) break;
}
return -1;
}
/**
5
1 2
1 3
2 4
3 5
5
1 2 3 4 5
**/