樹形dp 求樹的直徑

2022-06-27 03:39:11 字數 1393 閱讀 2538

隨著杭州西湖的知名度的進一步提公升,園林規劃專家湫湫希望設計出一條新的經典觀光線路,根據老闆馬小騰的指示,新的風景線最好能建成環形,如果沒有條件建成環形,那就建的越長越好。

現在已經勘探確定了n個位置可以用來建設,在它們之間也勘探確定了m條可以設計的路線以及他們的長度。請問是否能夠建成環形的風景線?如果不能,風景線最長能夠達到多少?

其中,可以興建的路線均是雙向的,他們之間的長度均大於0。

input  測試資料有多組,每組測試資料的第一行有兩個數字n, m,其含義參見題目描述;

接下去m行,每行3個數字u v w,分別代表這條線路的起點,終點和長度。

[technical specification]

1. n<=100000

2. m <= 1000000

3. 1<= u, v <= n

4. w <= 1000

output  對於每組測試資料,如果能夠建成環形(並不需要連線上去全部的風景點),那麼輸出yes,否則輸出最長的長度,每組資料輸出一行。

sample input

3 3

1 2 1

2 3 1

3 1 1

sample output
yes

題意 : 先判斷一下圖中是否有環,有就直接輸出yes,否則在輸出這個無環圖中的最長鏈

思路分析:判斷乙個圖中是否有環,採用並查集即可,找樹上的最長鏈,也就是樹的直徑,有兩種方法,一種是用採用樹形dp,那麼樹上最長的鏈就是當前結點最遠和次遠的兒子加起來的和。

dp[x][0] 表示樹上次遠的距離是多少, dp[x][1]表示樹上最遠的距離是多少。

**示例:

const int maxn = 1e5+5;

int n, m;

struct node

};vectorve[maxn];

int f[maxn];

int fid(int x)

bool pt[maxn];

int dp[maxn][2];

int ans;

void dfs(int x, int fa)

else if (dp[x][0] < dp[to][1]+cost)

}ans = max(ans, dp[x][1]+dp[x][0]);

}int main()

if (flag)

memset(pt, false, sizeof(pt));

memset(dp, 0, sizeof(dp));

ans = 0;

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

printf("%d\n", ans);

}return 0;

}

2334 樹的直徑(樹形DP)

原博主部落格 還有廣搜的寫法 描述 樹的直徑,即這棵樹中距離最遠的兩個結點的距離。每兩個相鄰的結點的距離為1,即父親結點與兒子結點或兒子結點與父子結點之間的距離為1.有趣的是,從樹的任意乙個結點a出發,走到距離最遠的結點b,再從結點b出發,能夠走的最遠距離,就是樹的直徑。樹中相鄰兩個結點的距離為1。...

hdoj3534 樹形dp,求樹的直徑的條數

題意 給出一棵樹,求樹上最長距離 直徑 以及這樣的距離的條數。思路 如果只求直徑,用兩次dfs即可。但是現在要求最長距離的條數,用dp1 u 記錄以u為根的子樹中葉子結點到u的最長距離,dp2 u 表示最長距離的條數,這兩個比較容易維護。dfs過程中更新答案,用ans1表示樹上直徑,ans2表示該直...

hdu 4607 樹形dp 樹的直徑

題目大意 給你n個點,n 1條邊,將圖連成一棵生成樹,問你從任意點為起點,走k k n 個點,至少需要走多少距離 每條邊的距離是1 思路 樹形dp求樹的直徑r a 若k r 1 ans k 1 b 若k r 1,ans r k r 1 2 include include includeusing n...