隨著杭州西湖的知名度的進一步提公升,園林規劃專家湫湫希望設計出一條新的經典觀光線路,根據老闆馬小騰的指示,新的風景線最好能建成環形,如果沒有條件建成環形,那就建的越長越好。
現在已經勘探確定了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 3sample output1 2 1
2 3 1
3 1 1
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...