我們知道當在乙個搜尋樹上,存在乙個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鍊錶,每條鍊錶存的是所有相同結點的...