日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > c/c++ >内容正文

c/c++

征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费

發(fā)布時間:2024/4/30 c/c++ 47 豆豆
生活随笔 收集整理的這篇文章主要介紹了 征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

大臣的旅費

很久以前,T王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用于連接首都和王國內(nèi)的各大城市。為節(jié)省經(jīng)費,T國的大臣們經(jīng)過思考,制定了一套優(yōu)秀的修建方案,使得任何一個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重復(fù)經(jīng)過大城市,從首都到達每個大城市的方案都是唯一的。J是T國重要大臣,他巡查于各大城市之間,體察民情。所以,從一個城市馬不停蹄地到另一個城市成了J最常做的事情。他有一個錢袋,用于存放往來城市間的路費。聰明的J發(fā)現(xiàn),如果不在某個城市停下來修整,在連續(xù)行進過程中,他所花的路費與他已走過的距離有關(guān),在走第x千米到第x+1千米這一千米中(x是整數(shù)),他花費的路費是x+10這么多。也就是說走1千米花費11,走2千米要花費23。J大臣想知道:他從某一個城市出發(fā),中間不休息,到達另一個城市,所有可能花費的路費中最多是多少呢?

輸入格式:

輸入的第一行包含一個整數(shù)n,表示包括首都在內(nèi)的T王國的城市數(shù)
城市從1開始依次編號,1號城市為首都。
接下來n-1行,描述T國的高速路(T國的高速路一定是n-1條)
每行三個整數(shù)Pi, Qi, Di,表示城市Pi和城市Qi之間有一條高速路,長度為Di千米。

輸出格式:

輸出一個整數(shù),表示大臣J最多花費的路費是多少。

樣例輸入:

5
1 2 2
1 3 1
2 4 5
2 5 4

樣例輸出:

135

樣例說明:

大臣J從城市4到城市5要花費135的路費。

根據(jù)資源限制盡可能考慮支持更大的數(shù)據(jù)規(guī)模。

資源約定:

峰值內(nèi)存消耗 < 64M
CPU消耗 < 5000ms

請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內(nèi)容。

所有代碼放在同一個源文件中,調(diào)試通過后,拷貝提交該源碼。

注意: main函數(shù)需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調(diào)用依賴于編譯環(huán)境或操作系統(tǒng)的特殊函數(shù)。
注意: 所有依賴的函數(shù)必須明確地在源文件中 #include , 不能通過工程設(shè)置而省略常用頭文件。

提交時,注意選擇所期望的編譯器類型。

代碼

#include <iostream> #include <vector> #include <cstring> #include <algorithm>using namespace std;int n;class Point { public:int num, cost;//點的編號,和到這個點的距離 };int ans;void f(vector<Point> m[], int vis[], int i, int j, int dis) { //查看是否直接鄰居vector<Point> nei_i = m[i];//i的鄰居的集合for (int k = 0; k < nei_i.size(); k++) {if (nei_i[k].num == j)//i的直接鄰居中有j{ans = max(ans, dis + nei_i[k].cost);return;}}vis[i] = 0; // 不是直接鄰居,就從現(xiàn)有的直接鄰居去連接for (int k = 0; k < nei_i.size(); k++) {int num = nei_i[k].num;if (vis[num] == -1)f(m, vis, num, j, dis + nei_i[k].cost);}vis[i] = -1; } int pnt=-1; void dfs(vector<Point> m[], int vis[], int start,int dis) {vector<Point> nei_i = m[start];//i的鄰居的集合vis[start]=0;bool isLeaf=true;for (int k = 0; k < nei_i.size(); k++) {int num = nei_i[k].num;//鄰居點的標號if (vis[num] == -1){isLeaf= false;dfs(m, vis, num,dis + nei_i[k].cost);}}vis[start]=-1;if(isLeaf){if(dis>ans){ans=dis;pnt=start;}} } int dis2money(int dis) {return 11 * dis + dis * (dis - 1) / 2; }int main(int argc, const char *argv[]) {scanf("%d", &n);vector<Point> m[n + 1];int vis[n + 1];memset(vis, -1, sizeof(vis));//初始化為-1for (int i = 0; i < n - 1; ++i) {int a, b, c;scanf("%d %d %d", &a, &b, &c);Point p1 = {b, c};Point p2 = {a, c};m[a].push_back(p1);m[b].push_back(p2);} /*1.暴力,求任意兩點間距離,并維護最長距離*//*for (int i = 1; i <= n - 1; ++i) {for (int j = i + 1; j <= n; ++j) { // int ans_t = ans;f(m, vis, i, j, 0); // if (ans > ans_t) { // cout << i << " " << j << " " << ans << endl; // }}}*/dfs(m,vis,1,0);ans=0;dfs(m,vis,pnt,0); // printf("%d\n", pnt);printf("%d\n", dis2money(ans)); // printf("%d\n", ans);return 0; }

總結(jié)

以上是生活随笔為你收集整理的征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。