藍橋杯 大臣的旅費 樹的最長度 兩次DFS

2021-09-19 15:50:04 字數 1319 閱讀 5836

#include #include 

#include

#include

#include

#include

#include

using

namespace

std;

const

int maxn = 1000000 + 10

;const

int inf = 10000000

;int

n;bool

used[maxn];

vector

g[maxn];

vector

e[maxn]; //

邊 int

d[maxn];

void

init()

void dfs(int

u) }

}void

solve()

//第一遍

init();

fill(d, d +n, inf);

d[0] = 0

;

//遞迴找到最遠路

dfs(0

);

int start = 0; //

得到最大值的下標

int max = -1

;

//為了找到最遠路

for (int i = 0; i < n; i++)}//

//樹的最長路求法:兩次dfs,從任意點出發一次dfs找到的最遠結點a,再從a開始進行一次dfs找到的最遠點既為樹的的直徑。

//第二遍

//從最遠路出發,dfs找到的最遠點一定是樹的直徑

//現有結論,從任意一點u出發搜到的最遠的點一定是s、t中的一點,然後在從這個最遠點開始搜,就可以搜到另乙個最長路的端點,

//即用兩遍廣搜就可以找出樹的最長路

init();

for (int i = 0; i < n; i++)

dfs(start);

int ans = -1

;

for (int i = 0; i < n; i++)

}ans = 10 * ans + ans * (ans + 1) / 2

;

cout

<< ans <}int

main()

posted @

2017-03-20 23:02

douzujun 閱讀(

...)

編輯收藏

大臣的旅費 藍橋杯

給你一顆樹,讓你求出樹上最遠的倆個點的距離 先以第乙個頂點為根,進行一次dfs,找出從第乙個點出發的最長的乙個直徑,然後再以直徑的另外乙個端點a,為根進行一次dfs,又可以找出另外乙個端點b,可以證明 a,b 即為樹的直徑 樹上任意倆點最遠的距離 下面是對這種證法的詳細證明 不是我證的。為了闡述清楚...

藍橋杯 大臣的旅費

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

藍橋杯 大臣的旅費

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