問題描述
好久之前,T王國空前繁榮。爲了更好地管理國家,王國修建了大量的快速路,用於鏈接首都和王國內的各大城市。ios
爲節省經費,T國的大臣們通過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者經過其餘大城市間接到達。同時,若是不重複通過大城市,從首都到達每一個大城市的方案都是惟一的。算法
J是T國重要大臣,他巡查於各大城市之間,體察民情。因此,從一個城市快馬加鞭地到另外一個城市成了J最常作的事情。他有一個錢袋,用於存放往來城市間的路費。測試
聰明的J發現,若是不在某個城市停下來修整,在連續行進過程當中,他所花的路費與他已走過的距離有關,在走第x公里到第x+1公里這一公里中(x是整數),他花費的路費是x+10這麼多。也就是說走1公里花費11,走2公里要花費23。spa
J大臣想知道:他從某一個城市出發,中間不休息,到達另外一個城市,全部可能花費的路費中最可能是多少呢?code
輸入格式
輸入的第一行包含一個整數n,表示包括首都在內的T王國的城市數blog
城市從1開始依次編號,1號城市爲首都。io
接下來n-1行,描述T國的高速路(T國的高速路必定是n-1條)ast
每行三個整數Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度爲Di公里。class
輸出格式
輸出一個整數,表示大臣J最多花費的路費是多少。stream
樣例輸入1
5
1 2 2
1 3 1
2 4 5
2 5 4
1 2 2
1 3 1
2 4 5
2 5 4
樣例輸出1
135
輸出格式
大臣J從城市4到城市5要花費135的路費。
任意兩點之間只有一條路徑,題目的數據其實挺水的,以前算法有大錯誤,結果都能對三個測試點,而後本身出測試點測試,找到缺陷所在,下面記錄一下本身的想法,遍歷全部的點,找出離這個點最遠的兩個距離,即第一大和第二大的,加起來就是通過這個點的最長路線,官方給出的算法是,從一個點開始,找到最遠的點,而後再從最遠的點開始,再找最遠的點,那麼就是整個樹的直徑了。這裏用樹形dp來找距離一個點的最遠點。
代碼:
#include <iostream> #include <cstdlib> #include <vector> #include <cstdio> //用通過某個點的最遠的兩個距離和來更新 using namespace std; typedef pair<int,int> pa; vector<pa> *v; int m; int dfs(int last,int k) { int m1 = 0,m2 = 0; for(int i = 0;i < v[k].size();i ++) { if(v[k][i].first == last) continue; int t = v[k][i].second + dfs(k,v[k][i].first); if(t > m1) m2 = m1,m1 = t; else if(t > m2) m2 = t; } m = max(m,m1 + m2); return m1; } int main() { int n; int p,q; int r; scanf("%d",&n); v = new vector<pa>[n + 1]; for(int i = 1;i < n;i ++) { scanf("%d%d%d",&p,&q,&r); v[p].push_back(pa(q,r)); v[q].push_back(pa(p,r)); } dfs(-1,1); printf("%d",m * 10 + (1 + m) * m / 2); }
#include <iostream> #include <cstdlib> #include <vector> #include <cstdio> //兩次dfs找最遠距離 using namespace std; typedef pair<int,int> pa; vector<pa> *v; int m; int t; void dfs(int last,int k,int sum) { if(last != -1 && v[k].size() == 1) { if(sum > m) { m = sum; t = k; } return; } for(int i = 0;i < v[k].size();i ++) { if(v[k][i].first == last) continue; dfs(k,v[k][i].first,sum + v[k][i].second); } } int main() { int n; int p,q; int r; scanf("%d",&n); v = new vector<pa>[n + 1]; for(int i = 1;i < n;i ++) { scanf("%d%d%d",&p,&q,&r); v[p].push_back(pa(q,r)); v[q].push_back(pa(p,r)); } dfs(-1,1,0); m = 0; dfs(-1,t,0); printf("%d",m * 10 + (1 + m) * m / 2); }