#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...