征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费
生活随笔
收集整理的這篇文章主要介紹了
征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
大臣的旅費
很久以前,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最多花費的路費是多少。
樣例輸入:
5
1 2 2
1 3 1
2 4 5
2 5 4
樣例輸出:
135
樣例說明:
大臣J從城市4到城市5要花費135的路費。
根據資源限制盡可能考慮支持更大的數據規模。
資源約定:
峰值內存消耗 < 64M
CPU消耗 < 5000ms
請嚴格按要求輸出,不要畫蛇添足地打印類似:“請您輸入…” 的多余內容。
所有代碼放在同一個源文件中,調試通過后,拷貝提交該源碼。
注意: main函數需要返回0
注意: 只使用ANSI C/ANSI C++ 標準,不要調用依賴于編譯環境或操作系統的特殊函數。
注意: 所有依賴的函數必須明確地在源文件中 #include , 不能通過工程設置而省略常用頭文件。
提交時,注意選擇所期望的編譯器類型。
代碼
#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; // 不是直接鄰居,就從現有的直接鄰居去連接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; }總結
以上是生活随笔為你收集整理的征战蓝桥 —— 2013年第四届 —— C/C++A组第10题——大臣的旅费的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 信息学奥赛一本通(C++)在线评测系统—
- 下一篇: 信息学奥赛一本通(C++)在线评测系统—