LeetCode 2581.統計可能的樹根數目:換根DP(樹形DP)

【LetMeFly】2581.統計可能的樹根數目:換根DP(樹形DP)

力扣題目鏈接:https://leetcode.cn/problems/count-number-of-possible-root-nodes/

Alice 有一棵 n 個節點的樹,節點編號為 0n - 1 。樹用一個長度為 n - 1 的二維整數數組 edges 表示,其中 edges[i] = [ai, bi] ,表示樹中節點 aibi 之間有一條邊。

Alice 想要 Bob 找到這棵樹的根。她允許 Bob 對這棵樹進行若干次 猜測 。每一次猜測,Bob 做如下事情:

  • 選擇兩個 不相等?的整數?u 和?v?,且樹中必須存在邊?[u, v]?。
  • Bob 猜測樹中?u?是?v?的 父節點?。

Bob 的猜測用二維整數數組?guesses 表示,其中?guesses[j] = [uj, vj]?表示 Bob 猜?uj 是?vj?的父節點。

Alice 非常懶,她不想逐個回答?Bob 的猜測,只告訴 Bob 這些猜測里面 至少?有?k?個猜測的結果為?true?。

給你二維整數數組 edges?,Bob 的所有猜測和整數?k?,請你返回可能成為樹根的?節點數目?。如果沒有這樣的樹,則返回 0

?

示例 1:

輸入:edges = [[0,1],[1,2],[1,3],[4,2]], guesses = [[1,3],[0,1],[1,0],[2,4]], k = 3
輸出:3
解釋:
根為節點 0 ,正確的猜測為 [1,3], [0,1], [2,4]
根為節點 1 ,正確的猜測為 [1,3], [1,0], [2,4]
根為節點 2 ,正確的猜測為 [1,3], [1,0], [2,4]
根為節點 3 ,正確的猜測為 [1,0], [2,4]
根為節點 4 ,正確的猜測為 [1,3], [1,0]
節點 0 ,1 或 2 為根時,可以得到 3 個正確的猜測。

示例 2:

輸入:edges = [[0,1],[1,2],[2,3],[3,4]], guesses = [[1,0],[3,4],[2,1],[3,2]], k = 1
輸出:5
解釋:
根為節點 0 ,正確的猜測為 [3,4]
根為節點 1 ,正確的猜測為 [1,0], [3,4]
根為節點 2 ,正確的猜測為 [1,0], [2,1], [3,4]
根為節點 3 ,正確的猜測為 [1,0], [2,1], [3,2], [3,4]
根為節點 4 ,正確的猜測為 [1,0], [2,1], [3,2]
任何節點為根,都至少有 1 個正確的猜測。

?

提示:

  • edges.length == n - 1
  • 2 <= n <= 105
  • 1 <= guesses.length <= 105
  • 0 <= ai, bi, uj, vj <= n - 1
  • ai != bi
  • uj != vj
  • edges?表示一棵有效的樹。
  • guesses[j]?是樹中的一條邊。
  • guesses?是唯一的。
  • 0 <= k <= guesses.length

方法一:換根DP(樹形DP)

首先我們可以把所有的猜想都存入哈希表中,以便對于某條邊,能快速知道其是否有被猜過。

由于節點范圍是 1 0 5 10^5 105,因此可以將 父節點 × 1 0 6 + 子節點 父節點 \times 10^6 + 子節點 父節點×106+子節點作為哈希表的鍵值。(注意可能會超32位整數)

假如只問“0”為根的話猜中次數是否 ≥ k \geq k k,那么我們只需要從 0 0 0開始對樹進行深度優先搜索:

搜索過程中統計邊被猜中的次數(借助哈希表可以在 O ( 1 ) O(1) O(1)時間內完成一次查詢),搜索結束后判斷是否 ≥ k \geq k k

現在要問“各個節點”為根的話猜中次數。怎么辦?在原有結果的基礎上再DP一次即可:

假設在現有的基礎上,xy的父節點。此時有cnt個猜中的邊。若把y變成x的父節點呢?

來自LeetCode官方題解的“樹換根圖”

變化的只有xy之間的一條邊。

若有猜(x, y),則猜中次數 c n t ? 1 cnt-1 cnt?1;若有猜(y, x),則猜中次數 c n t + 1 cnt+1 cnt+1

DP過程中(其實就是沿邊走的過程)不斷將父子關系對調,并統計 c n t ≥ k cnt\geq k cntk的個數即為答案。

  • 時間復雜度 O ( N + M ) O(N + M) O(N+M),其中 N N N是樹的節點個數, M = l e n ( g u e s s e s ) M=len(guesses) M=len(guesses)
  • 空間復雜度 O ( N + M ) O(N+M) O(N+M)

AC代碼

C++
typedef long long ll;
class Solution {
private:int cnt;  // 以0為根時答對的數目int ans;int k;vector<vector<int>> graph;unordered_set<ll> se;void dfs(int thisNode, int lastNode=-1) {for (int nextNode : graph[thisNode]) {if (nextNode == lastNode) {continue;}if (se.count((ll)thisNode * 1000000 + nextNode)) {cnt++;}dfs(nextNode, thisNode);}}void change(int thisNode, int lastNode, int cnt) {int cnt_bak = cnt;for (int nextNode : graph[thisNode]) {if (nextNode == lastNode) {continue;}if (se.count((ll)thisNode * 1000000 + nextNode)) {cnt--;}if (se.count((ll)nextNode * 1000000 + thisNode)) {cnt++;}ans += cnt >= k;change(nextNode, thisNode, cnt);cnt = cnt_bak;}}
public:int rootCount(vector<vector<int>>& edges, vector<vector<int>>& guesses, int k) {graph.resize(edges.size() + 1);for (vector<int>& edge : edges) {graph[edge[0]].push_back(edge[1]);graph[edge[1]].push_back(edge[0]);}for (vector<int>& guess : guesses) {se.insert((ll)guess[0] * 1000000 + guess[1]);}cnt = 0;this->k = k;dfs(0);ans = cnt >= k;change(0, -1, cnt);return ans;}
};
Python
from typing import Listclass Solution:  # AC,100.00%,92.59%def dfs(self, thisNode: int, lastNode: int) -> None:for nextNode in self.graph[thisNode]:if nextNode == lastNode:continueif (thisNode * 1000000 + nextNode) in self.se:self.cnt += 1self.dfs(nextNode, thisNode)def change(self, thisNode: int, lastNode: int, cnt: int) -> None:cnt_bak = cntfor nextNode in self.graph[thisNode]:if nextNode == lastNode:continueif (thisNode * 1000000 + nextNode) in self.se:cnt -= 1if (nextNode * 1000000 + thisNode) in self.se:cnt += 1self.ans += cnt >= self.kself.change(nextNode, thisNode, cnt)cnt = cnt_bak            def rootCount(self, edges: List[List[int]], guesses: List[List[int]], k: int) -> int:self.graph = [[] for _ in range(len(edges) + 1)]for x, y in edges:self.graph[x].append(y)self.graph[y].append(x)self.se = set()for x, y in guesses:self.se.add(x * 1000000 + y)self.cnt = 0self.dfs(0, -1)self.k = kself.ans = 1 if self.cnt >= k else 0self.change(0, -1, self.cnt)return self.ans

同步發文于CSDN和我的個人博客,原創不易,轉載經作者同意后請附上原文鏈接哦~
Tisfy:https://letmefly.blog.csdn.net/article/details/136372137

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

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

相關文章

debian/ubuntu 編譯安裝nginx php

debian/ubuntu 編譯安裝nginx php tar -zxvf nginx-1.9.9.tar.gz apt-get install libpcre3 libpcre3-dev ./configure --prefix/work/nginx-1.9.9 --with-pcre make make install service iptables stop #關閉防火墻, 可能不需要 修改nginx運行用戶為tboqi 抱著log目錄可…

【通信基礎知識】完整通信系統的流程圖及各模塊功能詳解

2024.2.29 抱歉最近在寫畢設大論文&#xff0c;因此沒有太多時間更新。然而&#xff0c;在寫論文的過程中&#xff0c;發現自己對通信系統的了解還不夠全明白&#xff0c;因此差了一些碩博論文總結了一個完整的通信系統流程圖。若有不對的地方請多多指正//部分內容有參考ChatGP…

【Elasticsearch管理】網絡配置

文章目錄 HTTP高級網絡設置高級TCP設置 TransportTCP傳輸概要文件Transport跟蹤 線程池fixed線程池fixed_auto_queue_sizescaling處理器設置 HTTP Elasticsearch只在默認情況下綁定到本地主機。對于運行本地開發服務器(如果在同一臺機器上啟動多個節點&#xff0c;甚至可以運行…

YOLOv7基礎 | 第2種方式:簡化網絡結構之yolov7.yaml(由104層簡化為30層)

前言:Hello大家好,我是小哥談。通過下載YOLOv7源碼可知,原始的yolov7.yaml文件是拆開寫的,比較混亂,也不好理解,并且為后續改進增添了很多困難。基于此種情況,筆者就給大家介紹一種將yolov7.yaml文件簡化的方法,將104層簡化為30層,并且參數量和計算量和原來是一致的,…

內存占用構造方法

#使用虛擬內存構造內存消耗 mkdir /tmp/memory mount -t tmpfs -o size5G tmpfs /tmp/memory dd if/dev/zero of/tmp/memory/block #釋放消耗的虛擬內存 rm -rf /tmp/memory/block umount /tmp/memory rmdir /tmp/memory #內存占用可直接在/dev/shm目錄下寫文件

《極客時間 - 左耳聽風》【文章筆記個人思考】

《極客時間 - 左耳聽風》原文鏈接&#xff1a;https://time.geekbang.org/column/intro/100002201?tabcatalog 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 10 | 如何成為一個大家愿意追隨的Leader&#xff1f; 這里的Leader是在技術上取得優勢&#xff0c;而不是行政…

2024年2月個人工作生活總結

本文為 2024年2月工作生活總結。 研發編碼 一些警告修正記錄 這個月修正了個人所負責的工程警告&#xff0c;這些警告其實是前人的代碼遺留的&#xff0c;我續寫的代碼&#xff0c;除printf函數的%d、%ld格式&#xff0c;都在寫的過程中改了。 下面記錄一些典型的警告及應對…

NLP(一)——概述

參考書: 《speech and language processing》《統計自然語言處理》 宗成慶 語言是思維的載體&#xff0c;自然語言處理相比其他信號較為特別 word2vec用到c語言 Question 預訓練語言模型和其他模型的區別? 預訓練模型是指在大規模數據上進行預訓練的模型&#xff0c;通常…

測試環境搭建整套大數據系統(七:集群搭建kafka(2.13)+flink(1.13.6)+dinky(0.6)+iceberg)

一&#xff1a;搭建kafka。 1. 三臺機器執行以下命令。 cd /opt wget wget https://dlcdn.apache.org/kafka/3.6.1/kafka_2.13-3.6.1.tgz tar zxvf kafka_2.13-3.6.1.tgz cd kafka_2.13-3.6.1/config vim server.properties修改以下倆內容 1.三臺機器分別給予各自的broker_id…

git操作學習記錄,簡單易上手

配置git 的賬戶郵箱 $ git config --global user.name "Firstname Lastname" $ git config --global user.email "your_emailexample.com"代碼回溯 git rest --hard [commit哈希值]git log命令只能查看以當前狀態為終點的歷史日志 git reflog命令&#x…

Python+neo4j構建豆瓣電影知識圖譜

文章目錄 數據來源數據整理導入節點和關系導入使用Subgraph批量導入節點和關系 多標簽實體和實體去重 數據來源 http://www.openkg.cn/dataset/douban-movie-kg 該網址擁有豐富的中文知識圖譜數據集&#xff0c;OpenKG(Open Knowledge Graph)&#xff0c;可供研究人員使用研究…

【golang】25、圖片操作

用 “github.com/fogleman/gg” 可以畫線, 框 用 “github.com/disintegration/imaging” 可以變換顏色 一、渲染 1.1 框和字 import "github.com/fogleman/gg"func DrawRectangles(inPath string, cRects []ColorTextRect, fnImgNameChange FnImgNameChange) (st…

Python爬蟲——Urllib庫-3

目錄 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 獲取豆瓣電影前十頁的數據 ajax的post請求 總結 ajax的get請求 獲取豆瓣電影第一頁的數據并保存到本地 首先可以在瀏覽器找到發送數據的接口 那么我們的url就可以在header中找到了 再加上UA這個header 進行請…

Facebook的元宇宙實踐:數字化社交的新前景

近年來&#xff0c;元宇宙&#xff08;Metaverse&#xff09;這一概念備受矚目&#xff0c;被認為是數字化社交的未來趨勢之一。而在眾多科技巨頭中&#xff0c;Facebook&#xff08;現更名為Meta&#xff09;一直處于元宇宙發展的前沿。在本文中&#xff0c;我們將深入探討Fac…

萬字帶你走過數據庫的這激蕩的三年

本文收集了卡內基梅隆大學計算機科學系數據庫學副教授 Andy Pavlo 從 2021 到 2023 連續三年對數據庫領域的回顧&#xff0c;希望通過連續三年的回顧讓你對數據庫領域的技術發展有所了解。 關于 Andy Pavlo&#xff1a;卡內基梅隆大學計算機科學系數據庫學副教授&#xff0c;數…

vuepress項目側邊欄菜單配置使用

第一種菜單配置&#xff0c;自定義菜單名稱 {text: 菜單名稱,// 是否折疊collapsible: true,children: [{text: "自定義md菜單名稱",sidebarDepth: 2,link: "/xxx/aa.md",children: [],}],},第二種菜單配置 標題自動生成菜單&#xff0c;使用需要搭配sideb…

c語言求矩陣的局部極大值

給定M行N列的整數矩陣A&#xff0c;如果A的非邊界元素A[i][j]大于相鄰的上下左右4個元素&#xff0c;那么就稱元素A[i][j]是矩陣的局部極大值。本題要求給定矩陣的全部局部極大值及其所在的位置。 輸入格式&#xff1a; 輸入在第一行中給出矩陣A的行數M和列數N&#xff08;3≤…

C語言創建結構體時 什么時候需要C++引用 什么情況下下不需要引用

在C語言中&#xff0c;結構體通常通過傳遞指針來實現對結構體的修改。當在函數中需要修改結構體的內容&#xff0c;并且希望這些修改在調用函數后仍然保持&#xff0c;可以考慮使用指針。引用是C中的一種特殊機制&#xff0c;用于更方便地傳遞參數&#xff0c;但在純粹的C語言中…

《springcloud alibaba》 三 sentinel流量控制

目錄 sentinel準備流控規則 qpspom.xmlapllication.yml啟動類controller查看結果流控提示不太友好 流控規則 線程數全局異常處理pom.xmlapplication.yml啟動類實體類controller類異常類測試 關聯流控模式關聯jmeter 鏈路servicecontroller代碼調整 流控效果Warm UP 熔斷降級規則…

[Flutter]用16進制顏色字符串初始化Color

使用&#xff1a; // 使用Color的靜態方法 fromARGB() 來創建顏色對象。透明度為 255&#xff08;完全不透明&#xff09; Color a Color.fromARGB(255, 42, 35, 72); // 使用八位的十六進制數來表示顏色&#xff0c;其中前兩位表示透明度&#xff0c;后六位表示紅色、綠色和…