樹的重心(雙dfs,換根)

思路:

基于樹形 DP 的兩次遍歷(第一次dfs計算以某個初始根(這里選了 1)為根時各子樹的深度和與節點數,第二次zy進行換根操作,更新每個節點作為根時的深度和)

換根原理:

更換主根,只需要對父節點進行運算即可,沒必要再次循環;后面代碼有詳解:

#include <bits/stdc++.h>
using namespace std;
const int N=1e6+5;
long long n,d[N],p[N],o[N];//deep數組存儲以每個節點為根時的總深度和,point數組存儲子樹大小
vector<vector<int>> a; // 鄰接表存儲樹結構

// 第一次DFS:計算以節點1為根時,每個節點的子樹大小和子樹總深度
void dfs(int x,int pr){
? ? p[x]=1; // 初始化當前節點的子樹大小為1(僅包含自身)
? ? d[x]=0; // 初始化當前節點的子樹總深度為0
? ??
? ? // 遍歷當前節點的所有鄰接節點
? ? for(auto i:a[x]){
? ? ? ? if(i!=pr){ // 避免處理父節點(防止重復計算)
? ? ? ? ? ? dfs(i,x); // 遞歸處理子節點
? ? ? ? ? ??
? ? ? ? ? ? // 更新當前節點的子樹總深度:
? ? ? ? ? ? // d[i]是子節點i的子樹總深度,p[i]是子節點i的子樹大小
? ? ? ? ? ? // 每個子節點i的子樹中的所有節點到當前節點的距離都要+1,因此增加p[i]
? ? ? ? ? ? d[x]+=d[i]+p[i];
? ? ? ? ? ??
? ? ? ? ? ? // 更新當前節點的子樹大小:加上子節點i的子樹大小
? ? ? ? ? ? p[x]+=p[i];
? ? ? ? }
? ? } ? ?
}

// 第二次DFS:換根DP,計算以每個節點為根時的總深度和
void zy(int x,int pr){
? ? // 遍歷當前節點的所有鄰接節點
? ? for(auto i:a[x]){
? ? ? ? if(i!=pr){ // 避免處理父節點
? ? ? ? ? ? // 核心換根公式:
? ? ? ? ? ? // d[x]是以x為根的總深度和
? ? ? ? ? ? // n-p[i]是除了i的子樹外的節點數
? ? ? ? ? ? // p[i]是i的子樹大小
? ? ? ? ? ? // 當根從x變為i時,i的子樹中所有節點的深度減少1(距離根更近了)
? ? ? ? ? ? // 其余節點的深度增加1(距離根更遠了)
? ? ? ? ? ? d[i]=d[x]+n-p[i]-p[i];
? ? ? ? ? ??
? ? ? ? ? ? // 遞歸處理子節點,繼續換根過程
? ? ? ? ? ? zy(i,x);
? ? ? ? }
? ? }
}

int main(){
? ? cin>>n; // 輸入節點數
? ? a.resize(n + 1); // 調整鄰接表大小
? ??
? ? // 輸入n-1條邊,構建樹
? ? int m,l;?
? ? for(int i=1;i<n;i++){
? ? ? ? cin>>m>>l;
? ? ? ? a[m].push_back(l);
? ? ? ? a[l].push_back(m);
? ? }
? ??
? ? // 第一次DFS:以節點1為根,計算初始子樹信息
? ? dfs(1,0);
? ? // 第二次DFS:換根DP,計算每個節點作為根時的總深度和
? ? zy(1,0);
? ??
? ? // 尋找總深度和最大的節點
? ? int mi=n;
? ? for(int i=n-1;i>0;i--){
? ? ? ? if(d[i]>=d[mi])mi=i;
? ? }
? ??
? ? // 輸出結果
? ? cout<<mi<<endl;
? ??
? ? return 0;
}

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/912155.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/912155.shtml
英文地址,請注明出處:http://en.pswp.cn/news/912155.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

官方App Store,直鏈下載macOS ,無需Apple ID,macOS10.10以上.

前言 想必很多人都有過維修老舊Mac的體驗,也有過想要重裝macos的體驗. 尤其是前者,想要重裝或者升級系統,由于官方已經無法更新,必須下載iSo鏡像 這時就會遇到死循環:想要更新macOS ,必須先使用更高版本的App Store,但要使用更高版本的App Store,必須先更新macOS !!! 如果想…

芋道生成前端界面代碼詳解

一、搜索框 1、整體架構 <ContentWrap> ... </ContentWrap><ContentWrap> 是頁面布局容器&#xff08;可能是自定義組件&#xff09;&#xff0c;包裹住頁面的內容區域。 2、el-form 表單&#xff08;搜索區域&#xff09; 2.1參數 <el-formclass&quo…

小程序入門:推廣技巧與運行數據查看解析

在當今數字化時代&#xff0c;小程序的應用愈發廣泛&#xff0c;無論是企業還是個人開發者&#xff0c;都希望自己的小程序能夠獲得更多用戶關注并順利運行。本文將詳細介紹小程序發布的流程、推廣策略以及如何查看運行數據&#xff0c;助力開發者更好地運營小程序。 一、小程…

sql server 將nvarchar長度設置成max有什么隱患

在學習 SQL Server 的過程中&#xff0c;很多開發者會選擇將 NVARCHAR 字段的長度設置為 MAX&#xff0c;以便于存儲大量文本數據。雖然這樣的設計在某些情況下可能會帶來便利&#xff0c;但卻潛藏著諸多隱患。本文將通過步驟性指導&#xff0c;幫助你理解這些隱患及其解決方式…

電商數據爬取實戰:如何挖掘隱藏的商業價值 ||電商API接口的應用價值

當你在深夜瀏覽電商平臺&#xff0c;目光被那些標注著“月銷10萬”的商品所吸引時&#xff0c;你是否曾思考過——這些驚人的數字背后隱藏著怎樣的商業秘密&#xff1f;今天&#xff0c;就讓我們化身為電商數據獵手&#xff0c;揮舞起爬蟲這把鋒利的手術刀&#xff0c;精心解剖…

??MQTT??通訊:??物聯網

??MQTT??通訊&#xff1a; ??物聯網&#xff08;IoT&#xff09;??&#xff1a;傳感器數據上報&#xff08;溫度、濕度&#xff09;、智能家居設備控制。 ??弱網絡環境??&#xff1a;移動網絡、衛星通信&#xff08;如遠程農業監測&#xff09;。 ??云端集成??…

swagger訪問不了的解決方案 http://localhost:8080/swagger-ui/index.html

確保增加 swagger 依賴 pom.xml <!-- Swagger --><dependency><groupId>org.springdoc</groupId><artifactId>springdoc-openapi-starter-webmvc-ui</artifactId><version>2.5.0</version></dependency> 在瀏覽器打開…

在 .NET Core WebAPI 項目中,執行文件(.exe)方式運行并指定端口

? 方法一&#xff1a;使用命令行指定端口 .NET Core WebAPI 項目默認使用 Kestrel Web 服務器&#xff0c;你可以通過環境變量或命令行參數來覆蓋默認監聽地址和端口。 示例命令&#xff1a; MyApi.exe --urls "http://localhost:5001"或者綁定所有主機地址&…

前綴樹進階-經典案例詳解

前綴樹進階-經典案例詳解 一、前綴樹基礎內容回顧二、單詞搜索建議系統2.1 問題描述2.2 解題思路2.3 Java代碼實現2.4 復雜度分析 三、單詞編碼3.1 問題描述3.2 解題思路3.3 Java代碼實現3.4 復雜度分析 四、最長單詞4.1 問題描述4.2 解題思路4.3 Java代碼實現4.4 復雜度分析 我…

Redis集群實現方式

? 一、什么是 Redis 集群&#xff08;Redis Cluster&#xff09; Redis 集群是 Redis 官方在 3.0 版本引入的分布式部署方案&#xff0c;它的目標是解決以下幾個問題&#xff1a; 單個 Redis 實例容量有限&#xff08;最多只能使用一個服務器的內存&#xff09; 單點故障&am…

《中國電信運營商骨干網:歷史、現狀與未來演進》系列 第五篇:新玩家入局——中國廣電CBNNET如何構建全國一張網?

專欄引言 在中國電信、聯通、移動三足鼎立的骨干網格局中&#xff0c;一位身負特殊使命的“國家隊新兵”正加速入場。它就是中國廣電。根據2023年發布的《廣電網絡融合發展戰略》&#xff0c;其核心任務是構建一張“新型廣電網絡”。手握700MHz“黃金頻段”和5G牌照&#xff0c…

QT 國際化 翻譯 總結

目錄 生成TS文件 單純Qt Creator工程 生成ts文件方式一&#xff1a;creator方式 生成ts文件方式二&#xff1a;命令行方式 vs2019QT工程 CMake工程 生成qm文件 代碼 需要先根據ui產生ts文件&#xff0c;再根據ts文件產生qm文件&#xff0c;然后代碼加載 生成TS文件 單…

Java 中實現 Excel 導入一些疑難雜癥

在 Java 中實現 Excel 導入功能時&#xff0c;除了已討論的字段映射、類型轉換和內存管理外&#xff0c;還需注意以下關鍵問題&#xff0c;結合常見踩坑點和最佳實踐總結如下&#xff1a; ?? 一、文件與格式校驗 文件類型與版本兼容性 明確區分 .xls&#xff08;HSSF&#x…

修改Docker-compose使Uptime-Kuma支持IPV6

之前部署了一個Uptime-Kuma用來監控服務的運行&#xff0c;最近&#xff0c;在監控IPV6網絡的時候出現了一點問題&#xff0c;Docker不支持IPV6網絡&#xff1a; 解決方案&#xff1a; 修改/etc/docker/daemon.json文件 {"experimental": true,"fixed-cidr-v6&…

分布式存儲架構的優勢

分布式存儲架構通過將數據分散存儲在多個物理節點上&#xff0c;在性能、可靠性及成本效益方面展現顯著優勢&#xff0c;具體核心優勢如下&#xff1a; 一、?彈性擴展能力? 水平無縫擴容? 通過添加節點即可線性擴展存儲容量與性能&#xff0c;支持EB級數據規模&#xff0…

【4目全景】基于海思3403平臺開發4目360°全景拼接相機方案

此文主要介紹基于海思3403平臺通過實時視頻采集&拼接&融合&顯示實現實時全景空間漫游體驗&#xff0c;該模組將4路視頻拼接成一幅360全景圖&#xff0c;涉及到計算機視覺、計算機圖形學、數字視頻處理等技術。 基本開發步驟主要包括以下幾個方面&#xff1a;4路視頻…

element-plus 按鈕 展開/隱藏

文章目錄 1、小記2、頁面3、typescript事件4、測試數據5、樣式 1、小記 element-plus中el-table 的 expand,箭頭控制子項顯示&#xff0c;有點丑。 想實現類似bootstrap &#xff0c;用按鈕 展開/隱藏子項的功能 2、頁面 <!-- 表內容 --><el-table:data"tabl…

SSE(Server-Sent Events)、WebSocket和Polling的對比

1. 基本概念 協議通信模式協議層數據流向連接方式SSE服務器單向推送基于HTTP/HTTPS服務器→客戶端&#xff08;單向&#xff09;持久化TCP連接WebSocket全雙工通信獨立協議&#xff08;基于TCP&#xff09;服務器?客戶端&#xff08;雙向&#xff09;持久化TCP連接&#xff0…

不同類型的微型導軌精度降低速度有何差異?

微型導軌是一種高精度、小體積、輕量化的直線運動導軌系統&#xff0c;廣泛應用于各種需要精密直線運動的領域。其精度等級是衡量其性能的重要指標&#xff0c;不同精度等級的導軌適用于不同的應用場景。那么&#xff0c;不同類型的微型導軌精度降低速度有何差異&#xff1f; 滾…

debian掛載新硬盤后不識別怎么辦?

在實際服務器部署或本地系統擴容的過程中&#xff0c;為 Debian 系統添加新硬盤是常見操作。無論是物理服務器、云服務器還是虛擬機環境中&#xff0c;當添加一塊新硬盤之后&#xff0c;我們的期望很簡單——系統應立即識別并支持掛載使用。 但理想歸理想&#xff0c;現實卻常…