历届试题 大臣的旅费(深搜 树的直径)
問題描述
很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用于連接首都和王國內的各大城市。
為節省經費,T國的大臣們經過思考,制定了一套優秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重復經過大城市,從首都到達每個大城市的方案都是唯一的。
J是T國重要大臣,他巡查于各大城市之間,體察民情。所以,從一個城市馬不停蹄地到另一個城市成了J最常做的事情。他有一個錢袋,用于存放往來城市間的路費。
聰明的J發現,如果不在某個城市停下來修整,在連續行進過程中,他所花的路費與他已走過的距離有關,在走第x千米到第x+1千米這一千米中(x是整數),他花費的路費是x+10這么多。也就是說走1千米花費11,走2千米要花費23。
J大臣想知道:他從某一個城市出發,中間不休息,到達另一個城市,所有可能花費的路費中最多是多少呢?
輸入格式
輸入的第一行包含一個整數n,表示包括首都在內的T王國的城市數
城市從1開始依次編號,1號城市為首都。
接下來n-1行,描述T國的高速路(T國的高速路一定是n-1條)
每行三個整數Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度為Di千米。
輸出格式
輸出一個整數,表示大臣J最多花費的路費是多少。
樣例輸入1
5
1 2 2
1 3 1
2 4 5
2 5 4
樣例輸出1
135
輸出格式
大臣J從城市4到城市5要花費135的路費。
深搜求樹的直徑,都忘了樹的直徑是啥了。一開始暴力搜索,在最后一個樣例上超時了。搜了搜題解是樹的直徑才是正解。樹的直徑其實就是求兩個點的最長路。
超時代碼:
樹的直徑(正解)
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cmath> #define ll long long using namespace std;const int maxx=1e4+100; struct node{int to;ll val; }; vector<node > p[maxx]; bool vis[maxx]; int n; int s; int len;void dfs(int x,int cur) {if(len<cur){len=cur;s=x;}for(int i=0;i<p[x].size();i++){if(!vis[p[x][i].to]){vis[p[x][i].to]=1;dfs(p[x][i].to,cur+p[x][i].val);}} }int main() {scanf("%d",&n);int x,y;ll val;node a;for(int i=0;i<n-1;i++){scanf("%d%d%lld",&x,&y,&val);a.to=y;a.val=val;p[x].push_back(a);a.to=x;p[y].push_back(a);}vis[1]=1;dfs(1,0);memset(vis,0,sizeof(vis));len=0;vis[s]=1;dfs(s,0);printf("%lld\n",(11+(len)+10)*len/2); }努力加油a啊,(o)/~
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的历届试题 大臣的旅费(深搜 树的直径)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 求两个球的体积并
- 下一篇: 算法训练 K好数(dp+动态规划)