藍橋杯 大臣的旅費(樹的最大直徑)

2021-07-30 05:20:24 字數 3660 閱讀 1646

問題描述

很久以前,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];

inthead[maxn];

inttot;

voidaddedge(intu,intv,intw)

intdis[maxn];// 儲存源點到每個頂點的最短距離

intvis[maxn];// 判斷當前頂點是不是已經入隊

intspfa(intsrc)

dis[src] = 0;

queue<int> que;

vis[src] = 1;

que.push(src);

while(!que.empty())

}

}

}

}

intmain()

spfa(1);

intans = 0, temp;

for(inti=1; i<=n; ++i)

}

spfa(temp);

for(inti=1; i<=n; ++i)

}

temp = ans;

ans = (temp*(temp+1))/2;

ans += 10*temp;

cout << ans << endl;

}

return0;

}

樹的直徑 藍橋杯 大臣的旅費

問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達。同時,如果不重複經過大城市,從首都到達每個大城市的方案都是唯一的。j...

樹的直徑 藍橋杯大臣的旅費

藍橋杯大臣的旅費 樹的直徑理論 首先從u dfs找到最遠點v 然後從v開始,dfs找到的最遠點一定是樹的直徑 證明 如果u v 和樹的直徑沒有公共點,則可以從樹的直徑終點到u引一條邊,樹直徑變長了,矛盾 假設交點為k,那麼k v 或者就是v本身 一定是樹直徑的一部分,最優子結構 這樣就證明了v一定在...

藍橋杯 歷屆試題 大臣的旅費(樹的直徑)

歷屆試題 大臣的旅費 時間限制 1.0s 記憶體限制 256.0mb 問題描述 很久以前,t王國空前繁榮。為了更好地管理國家,王國修建了大量的快速路,用於連線首都和王國內的各大城市。為節省經費,t國的大臣們經過思考,制定了一套優秀的修建方案,使得任何乙個大城市都能從首都直接或者通過其他大城市間接到達...