tarjan演算法找橋 鏈式向前星騷操作

2021-09-24 22:08:28 字數 1302 閱讀 4513

我們知道當在乙個搜尋樹上,存在乙個x的子節點y,使

dfn[x] < low[y]

則得出(x,y)是原圖的乙個橋。在更新low[x]時,fa[x]的dfn必定小於x的,但是在沒有重邊的情況下,fa[x]不是x的子節點,所以不能用其來更新low[x],但是在用重邊的時候是可以的。

所以最好的方法是記錄入邊的編號,而不是父節點的編號。我們又知道,在鏈式向前星的建圖方式中,在習慣下,與是編號相鄰的一對, 我們不妨從2開始編號。對於一對邊的編號a、b有以下關係:

a^1 = b

b^1 = a

所以我們可以通過異或的方式,對邊進行「轉向」。

下面是示例模板:

#include

#include

#include

#include

#include

#include

#include

#include

#include

#define ll long long

using

namespace std;

const

int n =

50005

;int he[n]

, ver[n*2]

, ne[n*2]

;int dfn[n]

, low[n]

, n, m, tot, num;

bool brid[n*2]

;void

add(

int x,

int y)

void

tarjan

(int x,

int in_ed)

else

if(i !=

(in_ed ^1)

) low[x]

=min

(low[x]

, dfn[y]);

}}intmain()

for(

int i =

1; i <= n; i++)if

(!dfn[i]

)tarjan

(i,0);

for(

int i =

2; i < tot; i +=2

)if(brid[i]

)printf

("%d %d\n"

, ver[i^1]

, ver[i]);

return0;

}

鏈式向前星

我們首先來看一下什麼是前向星.前向星是一種特殊的邊集陣列,我們把邊集陣列中的每一條邊按照起點從小到大排序,如果起點相同就按照終點從小到大排序,並記錄下以某個點為起點的所有邊在陣列中的起始位置和儲存長度,那麼前向星就構造好了.用len i 來記錄所有以i為起點的邊在陣列中的儲存長度.用head i 記...

鏈式向前星 學習理解

學習內容 鏈式向前星 真的說實話這東西不太難,但是看了一圈部落格都講得好奇怪啊,完全不像在講東西。好在看了一篇不錯的部落格 第一部分 儲存 int head ma int n,cnt 0 struct node edge ma 第二部分 新增邊 void add int u,int v,int w ...

鏈式向前星(陣列模擬鄰接表)

有的時候有的圖可能比較稀疏而且點數較多,鄰接矩陣存不下,所以就要用到鄰接表。鄰接錶用vector陣列比較方便,但是vector比較慢。所以就有了鏈式向前星。include include include using namespace std 鏈式向前星其實就是有n鍊錶,每條鍊錶存的是所有相同結點的...