Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- const int INF = 1e9;
- pair<int, int> dfs(int v, const vector<vector<int>> &g, int parent = 0) {
- int maxFC = -INF, maxEGU = -INF, maxEGU2 = -INF;
- for (int u : g[v]) {
- if (u != parent) {
- auto [fc, egu] = dfs(u, g, v);
- maxFC = max(maxFC, fc);
- if (egu > maxEGU2) {
- maxEGU2 = egu;
- if (maxEGU2 > maxEGU) swap(maxEGU, maxEGU2);
- }
- }
- }
- int degreeIncludingParent = (int)g[v].size();
- int degreeExcludingParent = (int)g[v].size() - !!parent;
- int fullyContained = max({maxFC, degreeIncludingParent-1+maxEGU, degreeIncludingParent-2+maxEGU+maxEGU2});
- int edgeGoingUp = max({degreeExcludingParent, degreeExcludingParent-1+maxEGU});
- return {fullyContained, edgeGoingUp};
- }
- int main() {
- int n; cin >> n;
- vector<vector<int>> g(1+n);
- for (int i = 1; i < n; ++i) {
- int u, v; cin >> u >> v;
- g[u].push_back(v);
- g[v].push_back(u);
- }
- cout << dfs(1, g).first << endl;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement