割點與其例題

割點

定義:

若一個點在圖中被去掉后,圖的連通塊個數增加,那么這個點就被稱為“割點”。如下圖所示紅點。

定義說白了就是若去掉一個點,圖被“斷開”的點稱為割點。

樸素算法:

  • 枚舉每個點 u。
  • 遍歷圖,如果有一個點或多個點遍歷不到(遍歷期間不能經過點 u),那么 u 就是割點。

時間復雜度: O ( N 2 ) O(N^2) O(N2)

可作為對拍暴力程序。

正解:Tarjan

定義一些東西:

  1. 時間戳:dfs 時表示每個點被遍歷到的“時間”,可用一個不斷增加的變量實現。記為 d f n dfn dfn
  2. 搜索樹:dfs 時由遍歷到的邊組成的樹(由于有打標記,所以不會重復訪問)。
  3. 追溯值:以 u 為根的子樹中,所有不經過 u 能夠到達的節點的時間戳的最小值。記為 l o w low low
關于追溯值:

結合張圖來理解:

設紅邊為搜索樹的邊,則 3 3 3 號點因為有藍色的邊不經過他的父親 2 2 2 號點,直接到達了 1 1 1 號點,所以 l o w 3 = d f n 1 low_3=dfn_1 low3?=dfn1?

回歸 Tarjan

有一個重要的概念:

一個點 u 如果是割點,那么它的子樹中的一些節點 v 的 l o w v low_v lowv? 是大等于 d f n u dfn_u dfnu? 的,因為它到不了上面(上面的意思是搜索樹中比 u 更早遍歷到的點集)。

顯然, l o w u low_u lowu? 表示假設斷開點 u 孩子們還能遍歷到的最早時間戳。

l o w v ≥ d f n u low_v\ge dfn_u lowv?dfnu? (v 是 u 的孩子),即 v 回不到 u 前,那么就表示 u 是割點。

s s s 個這樣的 v 就代表斷開 u 可以把原先的連通圖變成 s + 1 s+1 s+1 個連通塊(u 上方也是一個)。

遍歷路上

對于每個點 u,遍歷到的兒子 v 有兩種可能:

  1. d f n v = 0 dfn_v=0 dfnv?=0?

說明 v 是新加入搜索樹中的節點,那么就先遞歸下去,用 l o w v low_v lowv? 更新 l o w u low_u lowu?

l o w u = m i n ( l o w u , l o w v ) low_u=min(low_u,low_v) lowu?=min(lowu?,lowv?)

  1. d f n v ≠ 0 dfn_v\neq 0 dfnv?=0

說明 v 曾經

被遍歷過,是搜索樹上 u 的祖先,那么用 d f n v dfn_v dfnv? 更新 l o w u low_u lowu?

l o w u = m i n ( l o w u , d f n v ) low_u=min(low_u,dfn_v) lowu?=min(lowu?,dfnv?)

然而上述辦法還是有 bug。想想在哪呢?

發現 bug

假設我們搜索樹從 1 1 1 號點開始遍歷,給張圖你就懂。

如圖。

因為我們是從 1 1 1 號點開始遍歷的, 1 1 1 號點是搜索樹的根,它哪來的祖先能讓孩子們去更新追溯值啊!!!

而圖中的 1 1 1 號點又顯然不是割點。

咋辦呢?

解決 bug

特判唄。反正根只有一個。

這時候我們得思考:什么樣的情況下根是割點?

反正追溯值做不了了。

那么看看樸素的圖吧。

圖中 1 1 1 號點就是割點。

為啥嘞?

答:因為把它刪了后有兩個連通塊。

正解。

我們記錄一下,如果它在搜索樹上的兒子不止一個,那么它就是割點。

就這么簡單?

就這么簡單。

這時候不知道有沒有同學有個疑惑和我初學時一樣的,如圖:

紅色的是搜索樹邊。

圖中 1 1 1 不是割點啊,但它在樹上還真有兩個孩子啊??

如果您一開始沒看出來哪兒錯了,就點個贊再走吧。

注意到邊 3 → 2 3\rightarrow 2 32 1 → 2 1\rightarrow 2 12

當我們遍歷到點 3 3 3 的時候,它就會順帶把 2 2 2 號點先遍歷了。先遍歷到 2 2 2 再遍歷 3 3 3 同理。

所以說搜索樹應該為:

或:

OK,下班,看題。

洛谷 P3388 【模板】割點(割頂)。

題意很簡略了。就是看看實現。

#include<bits/stdc++.h>
using namespace std;
const int N=2e4+5,M=1e5+5;
int n,m,ehead[N],cnt_e,low[N],dfn[N],idx,rt,cntans;
bool ans[N];//是否為割點
struct E{int to,pre;
}e[M<<1];
void adde(int from,int to)
{e[++cnt_e].to=to;e[cnt_e].pre=ehead[from];ehead[from]=cnt_e;return;
}
void dfs(int u)
{low[u]=dfn[u]=++idx;int chtree=0;//如果是根的話,它的孩子個數for(int i=ehead[u];i;i=e[i].pre){int v=e[i].to;if(!dfn[v])//不在搜索樹上{dfs(v);low[u]=min(low[u],low[v]);if(rt==u)++chtree;if(low[v]>=dfn[u]&&rt!=u&&(!ans[u]))//注意 (!ans[u])。搞不好會重復算 cntans{++cntans;ans[u]=1;}}else//返祖邊low[u]=min(low[u],dfn[v]);}if(u==rt&&chtree>1&&(!ans[u])){++cntans;ans[u]=1;}return;
}
int main(){ios::sync_with_stdio(0);cin>>n>>m;for(int i=1,u,v;i<=m;++i){cin>>u>>v;adde(u,v);adde(v,u);}for(int i=1;i<=n;++i)//圖不保證聯通{if(!dfn[i]){rt=i;dfs(i);}}cout<<cntans<<'\n';for(int i=1;i<=n;++i)if(ans[i])cout<<i<<' ';cout<<'\n';return 0;
}

閑話時間

講個好玩的,這篇文章是我晚上十一點左右寫的,但是:

我來自報家門了。

正題。

Tarjan 算法不光能解決割點的問題,改一改還能當作強連通分量和割邊(又稱橋)和雙連通分量等等。

說到強連通分量,推銷一下我的學習筆記不過分吧 qwq。

完結撒花。

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

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

相關文章

圖卷積神經網絡(Graph Convolutional Network, GCN)

最近看論文看到了圖卷積神經網絡的內容&#xff0c;之前整理過圖神經網絡的內容&#xff0c;這里再補充一下&#xff0c;方便以后查閱。 圖卷積神經網絡&#xff08;Graph Convolutional Network, GCN&#xff09; 圖卷積神經網絡1. 什么是圖卷積神經網絡&#xff08;GCN&#…

安裝win11硬盤分區MBR還是GPT_裝win11系統分區及安裝教程

最近有網友問我,裝win11系統分區有什么要求裝win11系統硬盤分區用mbr還是GPT&#xff1f;我們知道現在的引導模式有uefi和legacy兩種引導模式&#xff0c;如果采用的是uefi引導模式&#xff0c;分區類型對應的就是gpt分區(guid)&#xff0c;如果引導模式采用的是legacy&#xf…

服務培訓QDA 的安裝調試方法,硬件模塊的講解和軟件控制臺使用及系統測試

#服務培訓##質譜儀##軟件控制##硬件模塊# 以下是關于Waters QDa單桿液質質譜儀的安裝調試、硬件模塊講解以及軟件控制臺使用培訓的相關內容&#xff1a; 安裝調試 場地準備&#xff1a;用戶需要提前準備好實驗室&#xff0c;確保實驗室環境符合儀器的要求&#xff0c;如溫度、…

在K8S集群中部署EFK日志收集

目錄 引言環境準備安裝自定義資源部署ElasticsearchMaster 節點與 Data 節點的區別生產優化建議安裝好以后測試ES是否正常部署Fluentd測試filebeat是否正常推送日志部署Kibana獲取賬號密碼&#xff0c;賬號是&#xff1a;elastic集群測試 引言 系統版本為 Centos7.9內核版本為…

polarctf-web-[rce1]

考點&#xff1a; (1)RCE(exec函數) (2)空格繞過 (3)執行函數(exec函數) (4)閉合(ping命令閉合) 題目來源&#xff1a;Polarctf-web-[rce1] 解題&#xff1a; 這段代碼實現了一個簡單的 Ping 測試工具&#xff0c;用戶可以通過表單提交一個 IP 地址&#xff0c;服務器會執…

【串流VR手勢】Pico 4 Ultra Enterprise 在 SteamVR 企業串流中無法識別手勢的問題排查與解決過程(Pico4UE串流手勢問題)

寫在前面的話 此前&#xff08;用Pico 4U&#xff09;接入了MRTK3&#xff0c;現項目落地需要部署&#xff0c;發現串流場景中&#xff0c;Pico4UE的企業串流無法正常識別手勢。&#xff08;一體機方式部署使用無問題&#xff09; 花了半小時解決&#xff0c;怕忘&#xff0c;…

ES(Elasticsearch)的應用與代碼示例

Elasticsearch應用與代碼示例技術文章大綱 一、引言 Elasticsearch在現代化應用中的核心作用典型應用場景分析&#xff08;日志分析/全文檢索/數據聚合&#xff09; 二、環境準備(前提條件) Elasticsearch 8.x集群部署要點IK中文分詞插件配置指南Ingest Attachment插件安裝…

臨床決策支持系統的提示工程優化路徑深度解析

引言 隨著人工智能技術在醫療領域的迅猛發展,臨床決策支持系統(CDSS)正經歷從傳統規則引擎向智能提示工程的范式轉變。在這一背景下,如何構建既符合循證醫學原則又能適應個體化醫療需求的CDSS成為醫學人工智能領域的核心挑戰。本報告深入剖析了臨床決策支持系統中提示工程的…

火山RTC 8 SDK集成進項目中

一、SDK 集成預備工作 1、SDK下載 https://www.volcengine.com/docs/6348/75707 2、解壓后 3、放在自己項目中的位置 1&#xff09;、include 2&#xff09;、lib 3)、dll 暫時&#xff0c;只需要VolcEngineRTC.dll RTCFFmpeg.dll openh264-4.dll&#xff0c; 放在intLive2…

OkHttp用法-Java調用http服務

特點&#xff1a;高性能&#xff0c;支持異步請求&#xff0c;連接池優化 官方文檔&#xff1a;提供快速入門指南和高級功能&#xff08;如攔截器、連接池&#xff09;的詳細說明&#xff0c;GitHub倉庫包含豐富示例。 社區資源&#xff1a;中文教程豐富&#xff0c;GitHub高…

python中常用的參數以及命名規范

以下是 Python 中常見的命名規范、參數用法及在大型項目中常用的操作模式&#xff0c;供記錄參考&#xff1a; 1. 命名規范&#xff08;Naming Conventions&#xff09; 前綴/形式含義示例_age單下劃線&#xff1a;弱“私有”標記&#xff08;可訪問但不建議外部使用&#xff…

第五十七篇 Java接口設計之道:從咖啡機到智能家居的編程哲學

目錄 引言&#xff1a;生活中的接口無處不在一、咖啡機與基礎接口&#xff1a;理解抽象契約1.1 咖啡制作的標準接口 二、智能家居與策略模式&#xff1a;靈活切換實現2.1 溫度調節策略場景 三、物流系統與工廠模式&#xff1a;標準接口下的多樣實現3.1 快遞運輸接口設計 四、健…

第二十六天打卡

全局變量 global_var 全局變量是定義在函數、類或者代碼塊外部的變量&#xff0c;它在整個程序文件內都能被訪問。在代碼里&#xff0c; global_var 就是一個全局變量&#xff0c;下面是相關代碼片段&#xff1a; print("\n--- 變量作用域示例 ---") global_var …

聯合查詢

目錄 1、笛卡爾積 2、聯合查詢 2.1、內連接 2.2、外連接 1、笛卡爾積 笛卡爾積&#xff1a; 笛卡爾積是讓兩個表通過排列組合的方式&#xff0c;得到的一個更大的表。笛卡爾積的列數&#xff0c;是這兩個表的列數相加&#xff0c;笛卡爾積的行數&#xff0c;是這兩個表的行…

【HTML5學習筆記2】html標簽(下)

1表格標簽 1.1表格作用 顯示數據 1.2基本語法 <table><tr> 一行<td>單元格1</td></tr> </table> 1.3表頭單元格標簽 表頭單元格會加粗并且居中 <table><tr> 一行<th>單元格1</th></tr> </table&g…

window 顯示驅動開發-分頁視頻內存資源

與 Microsoft Windows 2000 顯示驅動程序模型不同&#xff0c;Windows Vista 顯示驅動程序模型允許創建比可用物理視頻內存總量更多的視頻內存資源&#xff0c;然后根據需要分頁進出視頻內存。 換句話說&#xff0c;并非所有視頻內存資源都同時位于視頻內存中。 GPU 的管道中可…

《C 語言指針高級指南:字符、數組、函數指針的進階攻略》

目錄 一. 字符指針變量 二. 數組指針變量 三. 二維數組傳參 3.1 二維數組的本質 3.2 訪問方式與地址計算 3.3 二維數組的傳參方式 3.4 深入解析 *(*(arri)j) 與 arr[i][j] 的等價性 四. 函數指針變量 4.1 函數指針變量的創建 4.2 函數指針變量的使用 4.3 兩段"…

Unity:場景管理系統 —— SceneManagement 模塊

目錄 &#x1f3ac; 什么是 Scene&#xff08;場景&#xff09;&#xff1f; Unity 項目中的 Scene 通常負責什么&#xff1f; &#x1f30d; 一個 Scene 包含哪些元素&#xff1f; Scene 的切換與管理 &#x1f4c1; 如何創建與管理 Scenes&#xff1f; 什么是Scene Man…

內容中臺重構企業知識管理路徑

智能元數據驅動知識治理 現代企業知識管理的核心挑戰在于海量非結構化數據的有效治理。通過智能元數據分類引擎&#xff0c;系統可自動識別文檔屬性并生成多維標簽體系&#xff0c;例如將技術手冊按產品版本、功能模塊、適用場景進行動態標注。這種動態元數據框架不僅支持跨部…

Vue3:腳手架

工程環境配置 1.安裝nodejs 這里我已經安裝過了&#xff0c;只需要打開鏈接Node.js — Run JavaScript Everywhere直接下載nodejs&#xff0c;安裝直接一直下一步下一步 安裝完成之后我們來使用電腦的命令行窗口檢查一下版本 查看npm源 這里npm源的地址是淘寶的源&#xff0…