問題描述
很久以前,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最多花費的路費是多少。
樣例輸入15
1 2 2
1 3 1
2 4 5
2 5 4
樣例輸出1
135輸出格式
大臣j從城市4到城市5要花費135的路費。
求樹的直徑,方法:
樹的直徑是指樹的最長簡單路。求法: 兩遍bfs :先任選乙個起點bfs找到最長路的終點,再從終點進行bfs,則第二次bfs找到的最長路即為樹的直徑;
原理: 設起點為u,第一次bfs找到的終點v一定是樹的直徑的乙個端點
證明: 1) 如果u 是直徑上的點,則v顯然是直徑的終點(因為如果v不是的話,則必定存在另乙個點w使得u到w的距離更長,則於bfs找到了v矛盾)
2) 如果u不是直徑上的點,則u到v必然於樹的直徑相交(反證),那麼交點到v 必然就是直徑的後半段了
所以v一定是直徑的乙個端點,所以從v進行bfs得到的一定是直徑長度
bfs:
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
typedef long long ll;
#define pi 3.1415926535897932
#define e 2.718281828459045
#define inf 0x3f3f3f3f
#define mod 100000007
const int m=1005;
int n,m;
int cnt;
int sx,sy,sz;
//int g[m][m];
int pa[m*10],rankk[m];
int head[m*6],vis[m*100];
int dis[m*100];
ll prime[m*1000];
bool isprime[m*1000];
int lowcost[m],closet[m];
char st1[5050],st2[5050];
int len[m*6];
typedef pairac;
//vectorg[m*10];
int dp[m];
int has[10500];
int month[13]= ;
int dir[8][2]= ,,,,,,,};
void getpri()
};vectorg[m*100];
void dfs(int u,int sum)
edge[maxn];
int
head[maxn];
int
tot;
void
addedge(
int
u,
int
v,
int
w)
int
dis[maxn];
// 儲存源點到每個頂點的最短距離
int
vis[maxn];
// 判斷當前頂點是不是已經入隊
int
spfa(
int
src)
dis[src] = 0;
queue<
int
> que;
vis[src] = 1;
que.push(src);
while
(!que.empty())
}
}
}
}
int
main()
spfa(1);
int
ans = 0, temp;
for
(
int
i=1; i<=n; ++i)
}
spfa(temp);
for
(
int
i=1; i<=n; ++i)
}
temp = ans;
ans = (temp*(temp+1))/2;
ans += 10*temp;
cout << ans << endl;
}
return
0;
}
樹的直徑 藍橋杯 大臣的旅費
問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...
樹的直徑 藍橋杯大臣的旅費
藍橋杯大臣的旅費 樹的直徑理論 首先從u dfs找到最遠點v 然後從v開始,dfs找到的最遠點一定是樹的直徑 證明 如果u v 和樹的直徑沒有公共點,則可以從樹的直徑終點到u引一條邊,樹直徑變長了,矛盾 假設交點為k,那麼k v 或者就是v本身 一定是樹直徑的一部分,最優子結構 這樣就證明了v一定在...
藍橋杯 歷屆試題 大臣的旅費(樹的直徑)
歷屆試題 大臣的旅費 時間限制 1.0s 記憶體限制 256.0mb 問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達...