演算法詳解之縮點

2022-02-13 21:59:42 字數 897 閱讀 6220

縮點

顧名思義,就是在圖論演算法中將一些點縮成乙個點的一種演算法。

貌似明白了,但是這有什麼用呢?

我們經常求最短路,但是如果我們要求最長路呢?

標準問法:

給你一張有向圖,每個點都有乙個點權(不是邊權了哦),且每乙個點都可以經過任意多次,但是點權只能加一次,求這張圖的最大權值

題目分析:看到這,相信大多數人都會想到把最短路的模板改一下就行了,但是這會出問題,你會在乙個圈裡團團轉。

怎麼辦辦?

我們會發現,只要是一堆可以構成強連通分量的點,我們就可以將它們縮成乙個點,而這個點的點權就是它們的點權和,它的入邊就是它們所有點的入邊,出邊就是它們所有點的出邊。

放幾張圖有助於理解:

上圖中1.3.5就是乙個強連通分量

我們在tarjan求強連通分量時開過乙個陣列叫做color(或其他名字)來記錄乙個點 所屬於的強連通分量編號。所以我們可以遍歷每乙個點,看看它所能到達的點是否和它同處於同乙個強連通分量中,若不是,則依託它們強連通分量的編號再構建乙個有向無環圖 (想一想,為什麼要依託編號)

for(int i=1;i<=n;i++)

{ for(int j=0;j這樣我們就實現了縮點。

[apio2009]搶掠計畫

Tarjan演算法 縮點

我們這一篇是在已經了解tarjan演算法的基礎之上開始寫的,如果不了解的話,請先看大牛們 關於tarjan演算法的部落格。首先我們對於乙個有向無環的圖 dag 至少新增幾條邊才能使它變為強連通圖?我們很容易根據有向無環圖的性質得到,我們計算入度為零的點數為a,出度為零的點數為b,那麼我們至少需要新增...

Tarjan縮點 SPFA 縮點

洛谷p3387縮點 tarjan spfa求dag上單源最短路模板題 用tarjan在原圖上求scc 縮點 用縮點之後的scc建乙個有向無環圖 scc權為此scc內所有點點權和 在新建的dag上將scc權視為邊權跑spfa 求scc 1 到scc n 的最長路即為所求答案 include inclu...

Kosaraju縮點演算法詳解

相對於tarjan演算法,kosaraju演算法更容易理解,原理非常簡單,就是對一張有向圖進行兩次dfs遍歷。下面我們用一張圖作為例項,講解kosaraju演算法的實現過程 這是一張有向圖,對於強連通分量,我們一眼就看出來了,而機器有沒有眼睛,那怎麼識別呢?首先我們以從一號到五號節點順序進行dfs,...