洛谷 P1395 會議

【題目鏈接】

洛谷 P1395 會議

【題目考點】

1. 樹形動規:樹的重心

本題為求樹的重心模板題

【解題思路】

樹的重心:相比于樹中其它結點,其所有的子樹中結點數最多的子樹的結點數最少,該結點就是這棵樹的重心。
另一種定義:
結點的平衡值為以該結點為根的樹的所有子樹中結點數最多的子樹的結點數。樹的重心為平衡值最小的結點。

樹中所有點到某個點的距離和中,到重心的距離和是最小的。
見樹的重心相關證明

首先對無根樹進行dfs,得到有根樹,求出有根樹中以每個結點為根的子樹的結點數,該過程也是一個樹形動規的過程。
狀態定義:sizusiz_usizu?表示以結點u為根的子樹的大小,即以結點u為根的子樹的結點數量。
狀態轉移方程:以u為根的子樹的大小為所有以u的孩子v為根的子樹的大小加和,再加上1(結點u)。
sizu=∑sizv+1,v∈childusiz_u = \sum{siz_v}+1,v \in child_usizu?=sizv?+1vchildu?childuchild_uchildu?表示u的子結點構成的集合。

求出sizsizsiz數組的同時,可以求樹的重心。

狀態定義:dpudp_udpu?:結點u的平衡值。即結點u的所有子樹最大的子樹的大小。
狀態轉移方程:
無根樹中結點u的子樹,包括有根樹中結點u的子樹,以及結點u的“上方子樹”。
上方子樹指的是有根樹中除了以u為根的子樹外所有結點構成的子樹,該上方子樹的大小為n?sizun-siz_un?sizu?
因此dpu=max?{{sizv},n?sizu},v∈childudp_u = \max\{\{{siz_v}\}, n-siz_u\}, v\in child_udpu?=max{{sizv?},n?sizu?},vchildu?

具體實現時,對樹做dfs的過程中完成狀態轉移。嘗試訪問結點u的每個孩子,從結點u訪問到孩子v時,先進行dfs(v),搜索求出sizvsiz_vsizv?dpvdp_vdpv?,而后根據sizvsiz_vsizv?更新sizusiz_usizu?dpudp_udpu?
在訪問結點u的所有孩子后,再使用n?sizun-siz_un?sizu?更新dpudp_udpu?
dfs結束求出dpdpdp數組。樹的重心為平衡值最小的結點,那么求dpdpdp數組最小值的下標,即為樹的重心cent。
本題還要求求出所有結點到重心的距離和,該過程可以使用樹形動規完成、也可以使用深搜完成。
如果使用樹形動規完成:
以重心cent為根進行深搜:
狀態定義:disudis_udisu?,有根樹中以u為根的子樹中所有結點到u的距離加和。
狀態轉移方程:設v是u的一個孩子,那么v中所有結點到u的距離加和,為v中所有結點到v的距離加和disvdis_vdisv?。以v為根的子樹中所有結點要想到達u,還要經過邊(u,v),邊權為1。以v為根的子樹共有sizvsiz_vsizv?個結點,因此總路徑加和增加了sizvsiz_vsizv?。注意:由于整棵樹的根發生了改變,因此要重新求sizsizsiz數組。
所有結點到重心的路徑加和為discentdis_{cent}discent?

【題解代碼】

解法1:樹形動規 求樹的重心。樹形動規求路徑加和。

#include <bits/stdc++.h>
using namespace std;
#define N 50005
int n, siz[N], dp[N], dis[N];//siz[u]:以u為根的樹的結點數(的大小) dp[u]:以u為整棵樹的根時最大子樹的大小 
vector<int> edge[N];
void dfs(int u, int fa)
{siz[u] = 1;for(int v : edge[u]) if(v != fa){dfs(v, u);siz[u] += siz[v];dp[u] = max(dp[u], siz[v]);}dp[u] = max(dp[u], n-siz[u]);
}
void dfs2(int u, int fa)
{siz[u] = 1;for(int v : edge[u]) if(v != fa){dfs2(v, u);siz[u] += siz[v];dis[u] += dis[v]+siz[v];}
}
int main()
{int a, b, cent = 1;cin >> n;for(int i = 1; i < n; ++i){cin >> a >> b;edge[a].push_back(b);edge[b].push_back(a);	}dfs(1, 0);for(int i = 1; i <= n; ++i)if(dp[i] < dp[cent])cent = i;dfs2(cent, 0);cout << cent << ' ' << dis[cent]; return 0;
}

解法2:樹形動規 求樹的重心。深搜求路徑加和。

#include <bits/stdc++.h>
using namespace std;
#define N 50005
int n, siz[N], dp[N], ans;//siz[u]:以u為根的樹的結點數(的大小) dp[u]:以u為整棵樹的根時最大子樹的大小 
vector<int> edge[N];
void dfs(int u, int fa)
{siz[u] = 1;for(int v : edge[u]) if(v != fa){dfs(v, u);siz[u] += siz[v];dp[u] = max(dp[u], siz[v]);}dp[u] = max(dp[u], n-siz[u]);
}
void dfs2(int u, int fa, int len)//len:根到u的路徑長度 
{ans += len;for(int v : edge[u]) if(v != fa)dfs2(v, u, len+1);
}
int main()
{int a, b, cent = 1;cin >> n;for(int i = 1; i < n; ++i){cin >> a >> b;edge[a].push_back(b);edge[b].push_back(a);	}dfs(1, 0);for(int i = 1; i <= n; ++i)if(dp[i] < dp[cent])cent = i;dfs2(cent, 0, 0);cout << cent << ' ' << ans; return 0;
}

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

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

相關文章

Microsoft 365 Adoption Score功能深度解析:驅動企業數字化轉型的利器

在數字化轉型的浪潮中,Microsoft 365(原Office 365)憑借其強大的生產力工具和云服務生態,已成為全球企業和組織提升效率、協作和創新的核心平臺。然而,僅僅部署Microsoft 365并不足以充分發揮其潛力,關鍵在于如何推動員工高效采用這些工具,并將其融入日常工作流程。為此…

尺寸標注識別5 實例分割 roboflow | result.boxes獲取邊界框 | yolov8n-seg架構 torchinfo | 對直線關系不敏感

https://gitee.com/njsgcs/yolo-local 單標注一個尺寸線 100輪就百分百了 Sign in to Roboflow 有混起來的問題 roboflow訓練用的cocon-seg模型我網上找不到 上面這種比較麻煩 text的中心要在dt范圍內 屏幕點以下等同于按下save&#xff08;enter&#xff09; 取最長線段作…

敏捷開發卡在需求分析?飛算 JavaAI 加速需求確認與功能迭代

在敏捷開發中&#xff0c;需求分析常成為團隊推進的 “卡點”—— 模糊的需求描述、反復的需求變更、拆解落地難等問題&#xff0c;往往導致迭代周期延長。而飛算 JavaAI 作為專為 Java 開發設計的工具&#xff0c;正通過 “需求理解 - 接口設計 - 代碼生成” 的全流程智能化&a…

QT跨平臺應用程序開發框架(10)—— Qt窗口

目錄 一&#xff0c;關于窗口 二&#xff0c;菜單欄 2.1 菜單介紹 2.2 添加菜單 2.3 添加快捷鍵 2.4 添加其子菜單 2.5 添加分割線和圖標 三&#xff0c;工具欄 3.1 添加和使用工具欄 3.2 設置位置屬性 四&#xff0c;狀態欄 五&#xff0c;浮動窗口 六&#xff0c;對話框 6.1 …

git從本地倉庫添加到遠程倉庫

先創建&#xff0c;然后配置 Git 的全局用戶名和郵箱git config --global user.name "不吃糖o" git config --global user.email "1523944556qq.com" git config --global -l 查看設置的用戶名和郵箱如何生成SSH公鑰&#xff1f;ssh-keygen 生成sshkeyls ~…

鎖步核,為什么叫鎖步核?

“鎖步核”&#xff08;Lockstep Cores&#xff09;這一名稱源于其工作原理與軍事隊列行進中的“鎖步”&#xff08;Lockstep&#xff09;動作的類比。以下是詳細的說明整理&#xff1a;1. 軍事起源&#xff1a;什么是“鎖步”&#xff1f; 在傳統軍事訓練中&#xff0c;“鎖步…

python學智能算法(二十二)|SVM-點與超平面的距離

引言 前序學習進程中&#xff0c;了解了向量、向量點積運算、超平面、感知機等知識點。 SVM算法最核心的目標是通過規劃租號的分割超平面&#xff0c;來使得超平面附近的點到超平面的距離和達到最大值。 那點和超平面的距離如何計算&#xff0c;就是今天學習的重點。 點與超平…

參會邀請!2025世界人工智能大會合合信息技術交流日報名啟動!

2025世界人工智能大會即將開幕&#xff0c;合合信息邀請您一起參與KOL深度技術交流活動。本次活動不僅可以帶您逛展2025世界人工智能大會&#xff0c;在合合信息展臺體驗AI黑科技&#xff0c;還可以與行業頂尖技術專家面對面交流&#xff0c;共同探討當下熱門AI安全話題。 詳細…

零基礎入門:用C++從零實現TCP Socket網絡小工具

個人主頁&#xff1a;chian-ocean 文章專欄-Linux 前言&#xff1a; 網絡編程中的套接字&#xff08;Socket&#xff09;是通信的基本接口&#xff0c;允許不同計算機之間通過網絡交換數據。套接字是計算機網絡中通信的“端點”&#xff0c;通過它&#xff0c;應用程序可以與…

SOES:軟實現EtherCAT從站協議棧項目介紹及從站開發案例

在現代工業自動化領域&#xff0c;EtherCAT&#xff08;Ethernet for Control Automation Technology&#xff09;以其高速、實時和開放的特性&#xff0c;成為現場總線通信的主流協議之一。EtherCAT網絡中&#xff0c;主站&#xff08;Master&#xff09;負責調度和管理&#…

[simdjson] 填充字符串 | `document` 對象 | on-demand 模式

第二章&#xff1a;填充字符串 在第一章解析器中&#xff0c;我們學習了simdjson::dom::parser和simdjson::ondemand::parser作為可復用內存的JSON解析工具。 本章將深入解析JSON數據輸入的核心要求——“填充字符串”。 為何需要填充&#xff1f; simdjson通過SIMD&#x…

扭蛋機小程序開發:開啟線上娛樂新風尚

在當今數字化浪潮席卷的時代&#xff0c;娛樂方式正經歷著前所未有的變革。傳統的扭蛋機&#xff0c;那充滿驚喜與期待的實體裝置&#xff0c;曾是無數人童年回憶中的歡樂源泉。如今&#xff0c;隨著科技的飛速發展&#xff0c;扭蛋機小程序開發應運而生&#xff0c;將這份經典…

【React Native】布局和 Stack 、Slot

布局和Stack 點擊鏈接后&#xff0c;頁面切換時最好是有動畫效果。頁面一般都有頭部&#xff0c;里面有頁面的標題之類的東西。 在app目錄里&#xff0c;新建一個_layout.js文件&#xff0c;這是項目的布局文件。 這個名字是固定的&#xff0c;前面必須有一個_ 。 布局的意…

3C電子產品藍光三維掃描檢測方案-中科米堆CASAIM

隨著3C電子產品向輕薄化、精密化方向發展&#xff0c;傳統的二維檢測技術已難以滿足現代制造業對產品精度的高標準要求。特別是在智能手機、平板電腦等消費電子領域&#xff0c;微小的結構偏差都可能導致產品組裝困難或性能下降。當前行業內普遍面臨檢測效率低、數據采集不完整…

Docker 鏡像原理

Union FS(聯合文件系統) Union File System 是一種分層、輕量級并且高性能的文件系統&#xff0c;它支持對文件系統的修改作為一次提交來一層層的疊加&#xff0c;同時可以將不同目錄掛載到同一個虛擬文件系統下。UnionFS 是一種為 Linux&#xff0c;FreeBSD 和 NetBSD 操作系統…

為什么IoTDB成為物聯網場景的技術優選?

在物聯網、工業監控等領域&#xff0c;時序數據的高效管理成為技術架構設計的關鍵環節。時序數據庫作為專門處理帶時間戳數據的系統&#xff0c;其選型需兼顧性能、兼容性與場景適配性。本文將從技術角度解析 IoTDB 的設計理念與實踐方法&#xff0c;為時序數據庫選型提供參考。…

js中的微任務和宏任務的理解

在JavaScript中&#xff0c;微任務&#xff08;Microtask&#xff09;和宏任務&#xff08;Macrotask&#xff09;是異步任務執行機制的重要組成部分&#xff0c;它們共同構成了JavaScript事件循環&#xff08;Event Loop&#xff09;的核心邏輯。理解這兩個概念對于編寫高性能…

Spring-AI系列-AI模型-Model

原文-知識庫&#xff0c;歡迎大家評論互動 AI Model API Portable ModelAPI across AI providers for Chat, Text to Image, Audio Transcription, Text to Speech, and Embedding models. Both synchronous and stream API options are supported. Dropping down to access mo…

MySQL查詢今天、昨天、上周、近30天、去年等的數據的方法

目錄 常用的MySQL查詢今天、昨天、上周、近30天、去年等數據的方法 0、Sql server中DateDiff()用法 1、MySQL的DATE_SUB()函數 定義和用法 語法 實例 2、MySQL的TO_DAYS(date) 3、MySQL的DATE() 函數 定義和用法 4、MySQL NOW() 函數 定義和用法 語法 實例 例子 …

Linux —— B / 基礎開發工具

一、軟件包管理器1.1什么是軟件包1.2 Linux軟件生態1.3 yum具體操作1.3.1 查看軟件包1.3.2 安裝軟件1.3.3 卸載軟件1.3.4 注意事項1.4 安裝源二、編輯器Vim2-1 Linux編輯器-vim使用2-2 vim的基本概念2-3 vim的基本操作2-4 vim正常模式命令集2-5 vim末行模式命令集2-6 vim操作總…