TIOJ-1152

1.銀河帝國旅行社

https://tioj.ck.tp.edu.tw/problems/1152

Description

給一棵樹,找最遠的兩個點的距離

Solution

這裡用類似DP的方法
dfs(i) 回傳一個 {ans, deepest} 分別表示以$i$為根子樹中的答案和從$i$往下走的最遠距離
ans可以分成有經過$i$的和沒經過的,有經過的就看最深的兩個子樹加起來是多少,沒經過的就遞迴下去算

AC code

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
#include <bits/stdc++.h>
#define pb emplace_back
#define ff first
#define ss second
using namespace std;

int n;
vector<int> g[N];
pair<int,int> dfs(int i) {
    vector<int> tmp{0};
    int ans = 0;
    for(int j: g[i]) {
        auto p = dfs(j);
        ans = max(ans, p.ff);
        tmp.pb(p.ss+1);
    }
    sort(all(tmp), greater<int>());
    if(tmp.size() >= 2) ans = max(ans, tmp[0]+tmp[1]);
    return {ans, tmp[0]};
}
signed main() {
    ios_base::sync_with_stdio(0), cin.tie(0);
    cin >> n;
    for(int i = 0; i < n; i++) {
        int x;
        while(cin >> x && ~x) g[i].pb(x);
    }
    cout << dfs(0).ff << '\n';
}
comments powered by Disqus