3.1.1
unknown
c_cpp
2 years ago
2.3 kB
11
Indexable
#include <iostream>
#include <vector>
#include <iomanip>
#include <string>
#include <math.h>
using namespace std;
vector<vector<int>> s;
vector<int> d, was, ans, m;
int d1 = 0, d2 = 0;
int vv = -1, vv2 = -1;
void dfs(int v, int dd = 0, int c = -1) {
was[v] = 1;
d[v] = dd;
int fl = 0;
for (auto to : s[v]) {
if (!was[to]) {
fl = 1;
if(v == 0)
dfs(to, dd + 1, to);
else
dfs(to, dd + 1, c);
}
}
if (fl == 0) {
m[c] = max(m[c], dd);
if (m[c] > d1) {
if (vv != -1) {
d2 = d1;
vv2 = vv;
}
d1 = m[c];
vv = c;
}
else if (m[c] > d2) {
d2 = m[c];
vv2 = c;
}
}
}
int mn = 0;
void dfs2(int v, int c = -1) {
if (v == 1)
int t = 0;
was[v] = 1;
if (c == -1)
ans[v] = m[vv];
else {
if (c != vv && vv != -1)
ans[v] = max(m[c] - d[v], d[v] + m[vv]);
else if (vv != -1) {
if(vv2 != -1)
ans[v] = max(m[c] - d[v], d[v] + m[vv2]);
else {
ans[v] = max(m[c] - d[v], d[v]);
}
}
else {
ans[v] = max(m[c] - d[v], d[v]);
}
}
if (mn == 0)
mn = ans[v];
else
mn = min(mn, ans[v]);
for (auto to : s[v]) {
if (!was[to]) {
if (v == 0)
dfs2(to, to);
else
dfs2(to, c);
}
}
}
int main() {
int n; cin >> n;
if (n == 1) {
cout << "0 1 1";
return 0;
}
s.resize(n);
d.resize(n);
was.resize(n);
ans.resize(n);
m.resize(n);
for (int i = 0; i < n - 1; i++) {
int e, r;
cin >> e >> r;
e--; r--;
s[e].push_back(r);
s[r].push_back(e);
}
dfs(0);
was.clear();
was.resize(n, 0);
dfs2(0);
cout << mn << " ";
vector<int> a;
for (int i = 0; i < n; i++) {
if (ans[i] == mn)
a.push_back(i + 1);
}
cout << a.size() << " ";
for (auto i : a)
cout << i << " ";
}Editor is loading...
Leave a Comment