無向圖的點、邊雙連通分量

文章目錄

  • 點雙連通分量
  • 邊雙連通分量

有向圖的強連通分量:寒假學習筆記【匠心制作,圖文并茂】——1.20拓撲、強連通分量、縮點

點雙連通分量

在這之前,先讓我們了解幾個概念。

  • 割點:刪除一個點和其連出的邊后,原圖會裂為多個不連通的部分,這個點叫做割點。
  • 點雙連通分量(v-dcc,簡稱點雙):極?不含割點的連通?圖(和強連通分量的定義很像)。

OK,現在讓我們進入正題:求點雙連通分量。

其實,我們不難想到,既然點雙是極大不含割點的連通子圖,那么兩個割點之間的部分應該就是一個點雙,而割點本身則屬于多個點雙,那怎么找割點呢?

我們順著強連通分量的想法往下,如果我們先跑了一遍 tarjan,那么我們就會得到每個點的 lowdfn 值,那對于一個點雙它肯定長這樣:

這說明了什么?說明割點的子節點是無法通過其他邊與上面的點相連的,否則這個點就不是割點了,這說明割點的 low 值應該大于等于其 dfn 值,因為越往上,dfn 值就越小,low 值也就越小,只有在上面那種情況下 low 值才會大于等于 dfn 值。

當然,在上述情況中還有幾個特例,例如目前搜查的這個點沒有父親節點(即根節點),那就要看滿足上述條件的子樹有多少個,如果只有一個,那它也不是割點,否則就是。而對于其他點,因為它們都有兒子節點與父親結點,所以只要有滿足上述條件的子樹就行,不用管多少個。

找到割點了,現在該找點雙了。很明顯,割點及其子節點就是一個點雙,而按照強連通分量的做法,一個點的子節點都會被保存在棧中,所以我們只需要一直彈出棧頂,直到彈到割點就行了。

注意,我們前面說過:一個割點屬于多個點雙。所以我們在把割點彈出之后還要再放回棧中。

還有一種方案,就是我們不彈出割點,直接手動加上割點就行了。

核心代碼如下:

vector<int>v[N];
stack<int>st;
void v_dcc(int u,int fa)
{dfn[u]=low[u]=++ti;if(u==rt&&v[u].size()==0)//一個點自成點雙{cnt++;vdcc[cnt].emplace_back(u);return;}st.emplace(u);int son=0,sum=0;for(auto i:v[u]){if(i==fa){sum++;//解決重邊問題if(sum==1){continue;}}if(!dfn[i]){dfs(i,u);low[u]=min(low[u],low[i]);if(dfn[u]<=low[i])//因為割點可能有多個子樹,所以每掃到一個子樹就要算一遍{son++;if(son==1&&u!=rt||son>=2){cut[u]=true;//判斷割點}cnt++;while(!st.empty()){int x=st.top();st.pop();vdcc[cnt].emplace_back(x);if(x==i){break;}}vdcc[cnt].emplace_back(u);//割點屬于多個點雙}}else{low[u]=min(low[u],dfn[i]);}}
}

邊雙連通分量

同樣,在這之前,先了解幾個概念:

  • 橋:斷開后會讓圖分裂成兩個不連通的部分的線。
  • 邊雙連通分量(e-dcc,簡稱邊雙):極大不含橋的聯通子圖。

和上面的點雙類似,邊雙也是在強聯通分量的做法的基礎上改進的,我們先畫一個邊雙模版:

很顯而易見了,如果一條邊是一個橋,那么它以下的子樹都無法通過別的邊與上面向連通。

那么我們假設邊 (x,y) 是一個橋(x 在 y 上面),根據上面的性質就可以很輕松的得出 dfn[x]<low[y],因為上下不連通的嘛,所以下面的 low 值肯定會比上面的 dfn 值還大。

通過橋,我們可以找到第一種找 e-dcc 的方法:把所有的橋全部斷開,剩下的就是 e-dcc,不過難度有億點大。

現在讓我們回想上面對于橋的性質的描述:

如果一條邊是一個橋,那么它以下的子樹都無法通過別的邊與上面向連通。

這是不是很想我們講強連通分量里面的一句話:

我們假設一個節點與它的子樹形成了一個 SCC,那么它以及它的所有子樹都不會通過返祖邊與橫叉邊與其他點相連,而且一定會有返祖邊與這個根節點相連。

難道說,找 e-dcc 和找 SCC 有什么本質上的聯系嗎?

答案是有。根據橋的性質我們可以知道:一個橋以下的子樹的 low 是等于最頂上那個節點的 dfn 的(都分析了那么多遍了,這次應該自己看得懂了吧)。這跟 SCC 的求法幾乎一模一樣!

因此,我們就可以寫出代碼。

當然最后說一點:因為原圖是一個無向圖,所以并不存在前向邊和橫叉邊,因為這些邊都會通過一系列轉化變成返祖邊,因此 ins 數組就可以省去,因為所有的邊被換成返祖邊了之后,那些“祖先們”肯定只能和它下面的點形成 e-dcc,也就不存在會被提前“收服”的情況了。

核心代碼如下:

vector<int>v[N],edcc[N];
stack<int>st;
void e_dcc(int x,int fa)
{dfn[x]=low[x]=++ti;st.emplace(x);int sum=0;for(auto i:v[x]){if(i==fa){sum++;if(sum==1)//判重邊{continue;}low[x]=min(low[x],dfn[fa]);//否則更新}if(!dfn[i]){e_dcc(i,x);low[x]=min(low[x],low[i]);}else//不必再判{low[x]=min(low[x],dfn[i]);}}if(low[x]==dfn[x]){cnt++;while(1){int u=st.top();st.pop();edcc[cnt].emplace_back(u);if(u==x){break;}}}
}

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

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

相關文章

第六十二節:深度學習-加載 TensorFlow/PyTorch/Caffe 模型

在計算機視覺領域,OpenCV的DNN(深度神經網絡)模塊正逐漸成為輕量級模型部署的利器。本文將深入探討如何利用OpenCV加載和運行三大主流框架(TensorFlow、PyTorch、Caffe)訓練的模型,并提供完整的代碼實現和優化技巧。 一、OpenCV DNN模塊的核心優勢 OpenCV的DNN模塊自3.3…

Spring @Autowired自動裝配的實現機制

Spring Autowired自動裝配的實現機制 Autowired 注解實現原理詳解一、Autowired 注解定義二、Qualifier 注解輔助指定 Bean 名稱三、BeanFactory&#xff1a;按類型獲取 Bean四、注入邏輯實現五、小結 源碼見&#xff1a;mini-spring Autowired 注解實現原理詳解 Autowired 的…

勝牌?全球成為2026年FIFA世界杯?官方贊助商

勝牌全球將首次與國際足聯&#xff08;FIFA&#xff09;旗艦賽事建立合作關系。 此次贊助恰逢美國首個潤滑油品牌即將迎來160周年之際&#xff0c;其國際擴張步伐正在加快。 在這項全球頂級賽事籌備期間&#xff0c;勝牌全球將通過各種富有創意的零售和體驗活動與球迷互動。 …

YOLOV7改進之融合深淺下采樣模塊(DSD Module)和輕量特征融合模塊(LFI Module)

目錄 一、研究背景? 二. 核心創新點? ?2.1 避免高MAC操作? ?2.2 DSDM-LFIM主干網絡? 2.3 P2小目標檢測分支? ?3. 代碼復現指南? 環境配置 關鍵修改點 ?4. 實驗結果對比? 4.1 VisDrone數據集性能 4.2 邊緣設備部署 4.3 檢測效果可視化 ?5. 應用場景? …

【C/C++】chrono簡單使用場景

chrono使用場景舉例 1 輸出格式化字符串 示例代碼 auto now std::chrono::system_clock::now(); auto t std::chrono::system_clock::to_time_t(now); auto ms std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()) % 1000;std::ostrin…

Med-R1論文閱讀理解-1

論文總結&#xff1a;Med-R1: Reinforcement Learning for Generalizable Medical Reasoning in Vision-Language Models 論文寫了什么&#xff1f; 本文提出了一種名為 Med-R1 的新框架&#xff0c;旨在通過強化學習&#xff08;Reinforcement Learning, RL&#xff09;提升…

京東熱點緩存探測系統JDhotkey架構剖析

熱點探測使用場景 MySQL 中被頻繁訪問的數據 &#xff0c;如熱門商品的主鍵 IdRedis 緩存中被密集訪問的 Key&#xff0c;如熱門商品的詳情需要 get goods$Id惡意攻擊或機器人爬蟲的請求信息&#xff0c;如特定標識的 userId、機器 IP頻繁被訪問的接口地址&#xff0c;如獲取用…

MCU_IO驅動LED

注意事項&#xff1a; 1、亮度要求較高的情況下&#xff0c;不能由IO直接驅動LED MCU_IO引腳輸出的電壓和電流較弱&#xff0c;如果對光的亮度有要求的話&#xff0c;需要使用三極管來驅動。 MCU_IO的電壓一般為3.3V或者5V&#xff0c;輸出電流一般10mA-25mA。 2、不同顏色…

MyBatis 深度解析:高效 Java 持久層框架實踐指南(基于 3.5.10)

一、MyBatis 核心架構與設計哲學 MyBatis 作為半自動 ORM 框架&#xff0c;核心設計目標是在靈活性與開發效率之間取得平衡。與 Hibernate 等全自動 ORM 框架不同&#xff0c;MyBatis 允許開發者完全控制 SQL 編寫&#xff0c;同時通過映射機制減少重復代碼&#xff0c;特別適…

二叉樹(二)

98.驗證二叉樹 中序遍歷二叉樹&#xff0c;每次遍歷存下當前節點的值&#xff0c;遍歷到下一個節點比較&#xff0c;根據二叉搜索樹的特性&#xff0c;左<中<右有&#xff1a; 如果當前值小于或等于上一個的值&#xff0c;說明不是二叉搜索樹 如果當前值大于上一個節點…

解決Vue3+uni-app導航欄高亮自動同步方案

路由跳轉自動識別導航高亮實現方法 以下代碼使用wd-tabbar組件實現路由跳轉時自動同步導航欄高亮狀態&#xff0c;適用于所有的Vue3uni-app項目。 請根據自身使用框架類型完成&#xff0c;也可根據我使用的UI組件進行完成地址如下&#xff1a; Tabbar 標簽欄 | Wot UI &#…

免費論文查重與AI檢測工具推薦

文章目錄 概要一、PaperPass二、PaperYY注意 概要 畢業季&#xff0c;總少不了查重這一步&#xff0c;甚至查 AI 率。推薦兩款免費查重AIGC檢測的工具。 論文免費查重查AI&#xff1a; https://paperpass.com/ https://www.paperyy.com/ 一、PaperPass 網址&#xff1a; ht…

4、ubuntu系統 | 文本和目錄操作函數

1、目錄操作函數 ls(列出目錄內容) 用途:列出指定目錄中的文件和子目錄。語法:ls [選項] [路徑]常用選項: -l:以長格式顯示文件詳細信息(權限、所有者、大小、時間等)。-a:顯示隱藏文件(以.開頭的文件)。-R:遞歸列出子目錄內容。# 列出當前目錄下的所有文件和子目…

C++--范圍for循環詳解

范圍 for 循環是 C11 引入的語法特性&#xff0c;用于簡化遍歷容器或數組元素的過程。它比傳統 for 循環更簡潔安全&#xff0c;特別適合初學者。以下是詳細講解&#xff1a; 基本語法 for (元素類型 變量名 : 容器/數組) {// 循環體&#xff08;使用變量名訪問當前元素&#…

RDMA簡介1之RDMA開發必要性

為了滿足大批量數據的采集、存儲與傳輸需求&#xff0c;越來越多的數據密集型應用如機器學習、雷達、金融風控、航空航天等選擇使用現場可編程邏輯門陣列作為數據采集前端硬件來實現高性能的數據采集系統。FPGA憑借其高靈活性、高并行能力及可高度定制化的特點&#xff0c;能夠…

xmake的簡易學習

文章目錄 1. xmake是什么2. 一個可執行程序3. 一個庫文件4. 遍歷文件用法5. 第三方庫3.1 系統安裝庫3.2 獨立庫 6. 后續 由于前一篇博客的最后說要做一些rknn的優化&#xff0c;其實這個工作很早就完成了&#xff0c;但是我是使用 xmake這個來做我的工程的構建的&#xff0c;不…

【ArcGIS微課1000例】0147:Geographic Imager6.2下載安裝教程

文章目錄 一、軟件功能二、下載地址三、安裝教程Geographic Imager地圖工具使Adobe Photoshop空間圖像可以快速高效地工作。它增加了導入,編輯,操作和導出地理空間圖像的工具,例如航空和衛星圖像。Geographic Imager Mac功能非常強大,擁有柵格數據輸出、投影信息修改、基于…

【 java 集合知識 第一篇 】

1.概念 1.1.集合與數組的區別 集合&#xff1a;長度不固定&#xff0c;動態的根據數據添加刪除改變長度&#xff0c;并且只能存入引用類型&#xff0c;讀取采用迭代器或其他方法 數組&#xff1a;長度固定&#xff0c;不可改變&#xff0c;既可以存入基本類型也可以存入引用…

嵌入式開發學習日志(linux系統編程--系統編程之 進程間通信IPC)Day32

一、引言 空間獨立&#xff0c;需要一些操作&#xff1b; 分為三大類&#xff1a; 1、古老的通信方式 無名管道 有名管道 信號 2、IPC對象通信 system v BSD suse fedora kernel.org 消息隊列(用的相對少&#xff0c;這里不討論) …

metersphere不同域名的參數在鏈路測試中如何傳遞?

域名1&#xff1a;https://api.domain1.com 域名2&#xff1a;https://api.domain2.com 域名1的返回參數stteid會作為域名2的入參 步驟&#xff1a; 1&#xff09;先在metersphere—接口測試—接口定義中創建域名1和域名2的接口 2&#xff09;接口創建好后&#xff0c;在接口測…