--- tags: uva --- # Uva12862 - Intrepid climber ## 題目大意 你在一座山頂,其他朋友還在山腰,你要去向他們告知你已經攻頂了,雖然往下爬不會累,但往上爬會累,你要找出一條最不會累的路徑 (你在整個樹的頂點,每個 path 會有 weight,朋友在子樹的某個節點中,往上爬才消耗能量) ## 重點觀念 - dfs? ## 分析 - 你會發現如果把任意結果再加上最後去的節點到山頂消耗的能量,得出來的數字都會一樣,所以只要算出這個樹再減掉離頂點要消耗最多能量的能量就好了 ## 程式題目碼 ```cpp= #include <iostream> #include <vector> using namespace std; bool friends[100005]; vector<pair<int, int> > g[100005]; int max_depth, consumed_energy; int dfs(int cur, int depth) { int num_friends = 0; if (friends[cur]) { max_depth = max(max_depth, depth); num_friends += 1; } for (auto i = g[cur].begin(); i != g[cur].end(); i++) { int next_friends = dfs(i->first, depth + i->second); if (next_friends > 0) { consumed_energy += i->second; num_friends += next_friends; } } return num_friends; } int main() { int n, f; while (cin >> n >> f) { for (int i = 1; i < n + 1; i++) { friends[i] = false; g[i].clear(); } for (int i = 0; i < n - 1; i++) { int root, child, weight; cin >> root >> child >> weight; g[root].push_back(make_pair(child, weight)); } for (int i = 0; i < f; i++) { int where_friend; cin >> where_friend; friends[where_friend] = true; } max_depth = 0, consumed_energy = 0; dfs(1, 0); cout << consumed_energy - max_depth << endl; } return 0; } ```
×
Sign in
Email
Password
Forgot password
or
Sign in via Google
Sign in via Facebook
Sign in via X(Twitter)
Sign in via GitHub
Sign in via Dropbox
Sign in with Wallet
Wallet (
)
Connect another wallet
Continue with a different method
New to HackMD?
Sign up
By signing in, you agree to our
terms of service
.