小A與尤拉路(牛客-樹的直徑)
題解:
尤拉路:從圖中任意一個點開始到圖中任意一個點結束的路徑,並且圖中每條邊只通過恰好一次
問你走完這樹上所有的點最短路徑是什麼。
因為樹是沒有環的,所以你走到葉子結點的時候需要往回走,也就是再走一遍剛剛走過的路。
所以我們確定一條主道路,遇到分支就走一遍(主道路是不需要走兩遍的)。
因為所有長度都是已知的,所以最短路徑也就是儘量讓這一條主路變長。
想一想最長的一條主路,那不就是樹的直徑嗎。
用所有路徑長度*2-樹的直徑即為答案。
兩次dfs求樹的直徑
/*Keep on going Never give up*/
//#pragma GCC optimize(3,"Ofast","inline")
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
#define Accepted 0
#define AK main()
#define I_can signed
using namespace std;
const int maxn =2e5+10;
const int MaxN = 0x3f3f3f3f;
const int MinN = 0xc0c0c00c;
typedef long long ll;
const int inf=0x3f3f3f3f;
const ll mod=1e9+7;
vector<pair<int,int> > edge[maxn];
int ans,sum,node;
bool visited[maxn];
void dfs(int x,int fa,int now){
if(ans<now){
ans=now;
node=x;
}
for(auto i:edge[x]){
int v=i.first;
int w=i.second;
if(v==fa) continue;
if(!visited[v]){
dfs(v,x,now+w);
}
}
}
signed main(){
int n;
cin>>n;
for(int i=0;i<n-1;i++){
int x,y,z;
cin>>x>>y>>z;
edge[x].push_back(make_pair(y,z));
edge[y].push_back(make_pair(x,z));
sum+=z*2;
}
dfs(1,-1,0);
dfs(node,-1,0);
cout<<sum-ans<<endl;
return 0;
}
相關文章
- 尤拉路徑
- P7771 【模板】尤拉路徑
- 尤拉路徑學習筆記筆記
- 牛客題霸--求路徑
- 樹的直徑
- 尤拉序的小技巧
- 求樹的直徑(BFS/DFS)
- 尤拉計劃700:尤拉幣
- D48 樹的直徑 P3304 [SDOI2013] 直徑
- 圖論—尤拉回路/路徑圖論
- 一些“尤拉路”板題
- 演算法筆記 - 樹的直徑演算法筆記
- 尤拉五邊形數定理小記
- Day4 樹的直徑、重心以及基環樹
- 洛谷 P2731 騎馬修柵欄 Riding the Fences之尤拉路徑板子
- 尤拉篩
- 尤拉方程
- 尤拉定理
- 牛客題霸 [二叉樹中是否存在節點和為指定值的路徑] C++題解/答案二叉樹C++
- 尤拉降冪
- 尤拉函式φ函式
- 減小時間複雜度——尤拉的37%法則時間複雜度
- 【模板題】 543. 二叉樹的直徑二叉樹
- 樹7 堆中的路徑
- 旋轉矩陣與尤拉角的相互轉換矩陣
- 【Codeforces1404B】Tree tag | 樹上追擊、博弈、樹的直徑
- 尤拉函式的應用函式
- 尤拉公式 - 筆記公式筆記
- 【圖論】尤拉圖圖論
- 路徑上若干條樹的包含
- 素數篩(埃氏篩法與尤拉篩)
- 牛客練習賽40 B 小A與任務(貪心)
- 尤拉計劃686:2的冪
- 尤拉計劃739:和的和
- LeetCode第 543 題:二叉樹的直徑(C++)LeetCode二叉樹C++
- 牛客刷題回溯法之矩陣中的路徑 and 機器人的運動範圍矩陣機器人
- 劍指offer面試題12:矩陣中的路徑(Java版已在牛客網AC)面試題矩陣Java
- 尤拉函式入門函式