Submission #155894

#TimeUsernameProblemLanguageResultExecution timeMemory
155894DS007Torrent (COI16_torrent)C++14
31 / 100
13 ms760 KiB
#include <bits/stdc++.h>
using namespace std;

const int mn = 1005;
vector<int> adj[mn];
list<int> path;
int n, a, b, u, v;

bool find(int x, int p = -1) {
    if (x == b) {
        path.push_front(b);
        return true;
    }

    for (int i : adj[x]) {
        if (i != p && find(i, x)) {
            path.push_front(x);
            return true;
        }
    }

    return false;
}

int dfs(int x, int p = -1) {
    vector<int> s;
    int c = 0;

    for (int i : adj[x]) {
        if ((i == u && x == v) || (i == v && x == u) || i == p)
            continue;
        c++;
        s.push_back(dfs(i, x));
    }

    sort(s.begin(), s.end(), greater<>());

    int ans = 0;
    for (int i = 0, l = s.size(); i < l; i++)
        ans = max(ans, s[i] + i);

    return ans + 1;
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n >> a >> b;
    a--, b--;

    for (int i = 0; i < n - 1; i++) {
        int x, y;
        cin >> x >> y;
        x--, y--;
        adj[x].push_back(y);
        adj[y].push_back(x);
    }

    find(a);

    auto it = path.begin();
    u = *it;
    int ans = 1e9;

    for (it++; it != path.end(); it++) {
        v = *it;
        ans = min(ans, max(dfs(b) - 1, dfs(a) - 1));
        u = v;
    }

    cout << ans;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...