圖論(鄰接表)DFS

競賽中心 - 藍橋云課

#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int A=1e5+1;
typedef pair<int,int>p;
map<p,int>st;
vector<p>edge[A];
int a[A];
int result=0;
bool dfs(int s,int u,int father,int v,int sum)
{if(u==v){st[{s,v}]=sum;st[{v,s}]=sum;return true;}for(size_t i=0;i<edge[u].size();i++){int son=edge[u][i].first;if(son==father){continue;}if(dfs(s,son,u,v,sum+edge[u][i].second)){return true;}}return false;
}
signed main()
{// 請在此輸入您的代碼int N,K,u,v,t;cin>>N>>K;for(int i=0;i<N-1;i++){cin>>u>>v>>t;edge[u].push_back({v,t});edge[v].push_back({u,t});}for(int i=0;i<K;i++){cin>>a[i];}for(int i=0;i<K-1;i++){dfs(a[i],a[i],-1,a[i+1],0);result+=st[{a[i],a[i+1]}];}for(int i=0;i<K;i++){int result1=result;if(i==0){result1-=st[{a[i],a[i+1]}];}else if(i==K-1){result1-=st[{a[i-1],a[i]}];}else{result1-=st[{a[i-1],a[i]}];result1-=st[{a[i],a[i+1]}];dfs(a[i-1],a[i-1],-1,a[i+1],0);result1+=st[{a[i-1],a[i+1]}];}cout<<result1<<" ";}return 0;
}

構造鄰接表,由于題意中存在邊權值時間,定義鄰接表為pair類型。通過typedef關鍵字重命名了pair類型為p。

根據題目要求暴力搜索題目要求的路線,得到原路線的時間總和。

dfs函數:

bool dfs(int s,int u,int father,int v,int sum)
{if(u==v){st[{s,v}]=sum;st[{v,s}]=sum;return true;}for(size_t i=0;i<edge[u].size();i++){int son=edge[u][i].first;if(son==father){continue;}if(dfs(s,son,u,v,sum+edge[u][i].second)){return true;}}return false;
}

s和v分別代表路線的起點和終點,u代表當前節點,father代表當前節點的父節點(為了防止走回頭路),sum表示起點到當前節點的路徑和。

終止條件:當當前節點到達終點,st數組存儲路徑和。

遞歸邏輯:從當前節點向后遍歷,edge[u]這個鄰接表存儲了當前節點連接的子節點,遍歷每一個子節點(注意:i的類型要為size_t,要與edge[u].size()一致)。當前節點的子節點為edge[u][i].first(表示u節點出發的第i條邊,first表示節點值,second表示邊權),如果發現子節點等于父節點,走回頭路了,就結束這次循環,換下一個節點,如果子節點可以到達目標終點,則向上返回true,如果所有條件都沒有滿足,則返回false。

問題解決思路:

for(int i=0;i<K-1;i++){dfs(a[i],a[i],-1,a[i+1],0);result+=st[{a[i],a[i+1]}];}for(int i=0;i<K;i++){int result1=result;if(i==0){result1-=st[{a[i],a[i+1]}];}else if(i==K-1){result1-=st[{a[i-1],a[i]}];}else{result1-=st[{a[i-1],a[i]}];result1-=st[{a[i],a[i+1]}];dfs(a[i-1],a[i-1],-1,a[i+1],0);result1+=st[{a[i-1],a[i+1]}];}cout<<result1<<" ";}

先暴力搜索鄰接表(a中存儲的是節點值),得到每一步的路徑值,將他們累加起來得到目標路徑總和。得到最終結果分為三種情況,第一種情況為刪掉的節點是第一個節點,就將第一個節點和第二個節點的路徑減去就解決了。第二種情況是刪掉的節點是最后一個節點,就將最后一個節點和倒數第二個節點的路徑減去就解決了。第三種情況為其他,減去左右兩節點的路徑和后還要加上左節點到右節點的路徑和,這個路徑和并沒有搜索過,所以要再進行一遍搜索。

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

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

相關文章

深入理解VideoToolbox:iOS/macOS視頻硬編解碼實戰指南

引言&#xff1a;VideoToolbox框架概述 VideoToolbox是Apple提供的底層框架&#xff0c;首次在WWDC2014上推出&#xff0c;為iOS和macOS開發者提供直接訪問硬件編碼器和解碼器的能力。作為Core Media框架的重要組成部分&#xff0c;VideoToolbox專注于視頻壓縮、解壓縮以及Cor…

Python基礎語法練習

本文涵蓋了 Python 基礎編程中的多個重要概念&#xff0c;從簡單的輸出語句到運算符、字符串操作、變量賦值等都有涉及。這些例子非常適合初學者學習和理解 Python 的基本語法。1. Hello World# 輸出Hello Worldprint("Hello, World!")2. 變量賦值# 創建變量并賦值na…

關于“致命錯誤:‘https://github.com/....git/‘ 鑒權失敗”

問題分析 錯誤信息&#xff1a; remote: Invalid username or token. Password authentication is not supported for Git operations. 致命錯誤&#xff1a;https://github.com/yarajia/LittleTestToolsProject.git/ 鑒權失敗原因&#xff1a;GitHub從2021年8月13日起不再支持…

基于Flask + Vue3 的新聞數據分析平臺源代碼+數據庫+使用說明,爬取今日頭條新聞數據,采集與清洗、數據分析、建立數據模型、數據可視化

介紹 本項目為新聞數據分析平臺&#xff0c;目的是爬取新聞(目前僅含爬取今日頭條)數據&#xff0c;然后對數據進行展示、采集與清洗、數據分析、建立數據模型、數據可視化。本項目采用前后端分離模式&#xff0c;前端使用 Vue3 ArcoDesign 搭建&#xff0c;后端使用 Python …

LabVIEW數字抽取濾波

?基于 LabVIEW 平臺設計數字抽取濾波器&#xff0c;用于動態測試領域&#xff0c;解決高采樣率數據的大動態范圍需求與頻帶劃分問題。方案替換硬件為可靠性優異的品牌&#xff0c;通過虛擬儀器架構實現信號處理功能&#xff0c;為動態信號分析提供高效、可復用的設計參考。應用…

云原生時代的 Linux:容器、虛擬化與分布式的基石

&#x1f4dd;個人主頁&#x1f339;&#xff1a;慌ZHANG-CSDN博客 &#x1f339;&#x1f339;期待您的關注 &#x1f339;&#x1f339; 在云計算與容器化快速發展的今天&#xff0c;Linux 已經不再只是服務器上的操作系統&#xff0c;而是整個云原生生態的底層基石。無論是運…

多場景兩階段分布式魯棒優化模型、數據驅動的綜合能源系統

基于數據驅動的綜合能源系統多場景兩階段分布式魯棒優化模型 魯棒優化是應對數據不確定性的一種優化方法&#xff0c;但單階段魯棒優化過于保守。為了解決這一問題&#xff0c;引入了兩階段魯棒優化(Two-stage Robust Optimization)以及更一般的多階段魯棒優化&#xff0c;其核…

Python實現點云PCA配準——粗配準

本節我們來介紹PCA&#xff08;主成分分析&#xff09;算法進行點云配準&#xff0c;這是一種經典的統計降維與特征提取工具&#xff0c;在三維點云處理中常被用來完成“粗配準”。其核心思想是&#xff1a;先把兩個待對齊的點云各自進行主成分分解&#xff0c;獲得各自的“主軸…

零基礎深度學習規劃路線:從數學公式到AI大模型的系統進階指南

引言在人工智能革命席卷全球的2025年&#xff0c;深度學習已成為改變行業格局的核心技術。本規劃路線整合最新教育資源與實踐方法&#xff0c;為完全零基礎的學習者構建一條從數學基礎到AI大模型的系統學習路徑。通過清華大佬的實戰課程、吳恩達的經典理論、Kaggle競賽的實戰錘…

基于Vue.js和Golang構建高效在線客服系統:前端實現與后端交互詳解

在當今互聯網時代&#xff0c;在線客服系統已成為企業與用戶溝通的重要橋梁。本文將詳細介紹如何使用Vue.js作為前端框架&#xff0c;Gin作為后端框架&#xff0c;構建一個高效的在線客服系統。一、項目背景與技術選型項目背景隨著電子商務的迅猛發展&#xff0c;用戶對即時咨詢…

虛幻GAS底層原理解剖九 (內存管理)

提示&#xff1a;文章寫完后&#xff0c;目錄可以自動生成&#xff0c;如何生成可參考右邊的幫助文檔 文章目錄前言一、整體內存管理思路概覽二、核心對象的生命周期與托管邏輯UGameplayAbility 的管理GameplayEffect 的內存管理ActiveGameplayEffect 生命周期三、屬性&#xf…

Rust 通用庫新增 WebAssembly

1 先判斷&#xff1a;也許你的 crate 已經能跑 Wasm&#xff01;排查阻礙因素 直接文件/網絡 I/O塊式&#xff08;同步&#xff09;I/Ostd::thread 線程創建并不受支持的 C 系統庫綁定快速驗證rustup target add wasm32-unknown-unknown cargo build --target wasm32-unknown-…

java分布式定時任務

一、分布式鎖的底層實現細節&#xff08;以 Redis 為例&#xff09;分布式鎖是解決任務重復執行的核心&#xff0c;需保證原子性、超時釋放和可重入性。以下是生產級 Redis 鎖實現&#xff1a;public class RedisDistributedLock {private final RedisTemplate<String, Stri…

Kafka 的基本操作(1)

Kafka 是一個分布式流處理平臺&#xff0c;核心功能是高吞吐量的消息發布與訂閱。以下是 Kafka 最常用的基本操作&#xff0c;涵蓋環境啟動、主題管理、消息生產與消費等核心場景&#xff08;基于 Kafka 2.x 版本&#xff0c;使用命令行工具&#xff09;。 一、環境準備與啟動 …

React 為什么要自定義 Hooks?

歷史相關文章2024年&#xff1a; React 為什么引入 Hooks &#xff1f; React 中&#xff0c;Hook 是一個特定的概念 自定義 Hook&#xff08;Custom Hook&#xff09;在 React 中相當于&#xff1a; ? 一個可以復用的邏輯片段&#xff0c;封裝了多個內置 Hooks 的組合和行為 …

[激光原理與應用-181]:測量儀器 - 頻譜型 - 干涉儀,OCT(光學相干斷層掃描技術)

OCT&#xff08;光學相干斷層掃描技術&#xff09;的核心工作原理基于低相干光干涉&#xff0c;通過測量生物組織或材料內部不同深度結構的背向散射光信號差異&#xff0c;構建高分辨率的二維或三維圖像。以下是其工作原理的詳細解析&#xff1a;一、基礎原理&#xff1a;低相干…

python學智能算法(三十五)|SVM-軟邊界拉格朗日方程乘子非負性理解

【1】引言 前序學習進程中&#xff0c;已經學習了構建SVM軟邊界拉格朗日方程&#xff0c;具體方程形式為&#xff1a; L(w,b,ξ,α,μ)12∣∣w∣∣2C∑i1nξi?∑i1nαi[yi(w?xib)?1ξi]?∑i1nμiξiL(w,b,\xi,\alpha,\mu)\frac{1}{2}||w||^2C\sum_{i1}^{n}\xi_{i}-\sum_{i…

LeetCode 刷題【34. 在排序數組中查找元素的第一個和最后一個位置、35. 搜索插入位置】

34. 在排序數組中查找元素的第一個和最后一個位置 自己做 解&#xff1a;二分查找 class Solution { public://二分查找int halfFind(vector<int> nums, int begin, int end, int target){if(begin > end) //找不到的情況return -1;int mid (begin end) / …

Vue3 計算屬性與監聽器

文章目錄計算屬性配置項 computedHTML 結構Vue 實例數據方法計算屬性綁定數據和方法完整代碼vue3商品加減案例監聽器配置項 watch簡單類型寫法深度監聽寫法計算屬性配置項 computed 使用 Vue 實現一個商品價格計算器&#xff0c;設置一個初始單價&#xff0c;初始數量為 1&…

Mysql如何遷移數據庫數據

文章目錄一、使用 mysqldump 工具&#xff08;最常用&#xff09;&#xff08;一&#xff09;導出數據&#xff08;二&#xff09;導出數據庫&#xff08;不含數據&#xff09;&#xff08;三&#xff09;導出指定表&#xff08;四&#xff09;導入數據二、直接拷貝文件三、使用…