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';
}
|