求解邊雙聯通分量的方法

2021-08-02 09:33:26 字數 2120 閱讀 5565

我們在求解邊雙連通分量的時候,只需要把每個點從哪條邊走來進行記錄就行了

所謂邊雙連通分量是指不存在橋的乙個子圖,也可以說從乙個點到另乙個點一定是有兩條邊不相交的路的

對於這樣一張圖,我們要如何去求出其中的邊雙連通分量?我們會發現,對於這一整張圖,任意兩點都可以互達並且路徑無邊相交,並且圖中顯然不存在橋

如果是普通的tarjan演算法,對於雙向邊,會搜回去,所以我們限制其不能走反向邊,加入dfs的順序是abcde,dfs遍歷圖是這樣的順序:

給每一對雙向邊編乙個序號

操作如下:

tail++;

line[tail].from=from;

line[tail].to=to;

line[tail].nxt=head[from];

head[from]=tail;

tail++;

line[tail].from=to;

line[tail].to=from;

line[tail].nxt=head[to];

head[to]=tail;

cc++;

line[tail].cnn=cc;

line[tail-1].cnn=cc;}

也就是最後兩行在給每一對雙向邊編號

假如在插入邊的時候是按照如圖所示的 第一次插入的是a->b,第二次是b->c…etc.

那麼我們把fa[b]定義為1,把fa[c]定義為2(也即從哪條邊走來),這樣在forc的子點的時候,我們會for到b,而這條邊的雙向邊編號是2,此時遇到fa[c]=該子點與c的邊的雙向邊編號,所以我們不走它

也即下面的這小段**

for(register int i=head[u];i;i=line[i].nxt)else

}

我們可以發現,其實其和求強連通分量的差別只是不能倒回去經過剛才已經經過過的邊,這樣一來我們完整地從沙漏圖的a走到b走到c走到d走到e,而遍歷所有的邊,雖然c這個點經過了兩次,但是我們成功地遍歷完所有的邊而沒有因為重複而只能遍歷上半部分或者下半部分,如果按照強連通分量的遍歷方法,我們會發現在在tarjan(c)點的時候,遍歷c點下面的子樹,依次遍歷d點和e點,然後會回到c點,最後退出來的時候我們會發現c點d點e點形成了乙個強連通分量???233所以我們要把乙個點是從**走過來的打上標記

完整**:

#include

#include

#include

#define maxn 100000

using

namespace

std;

struct lineline[maxn];

int head[maxn],stack[maxn],top,tail,cc,fa[maxn],low[maxn],dfn[maxn],tim,cnt,scc[maxn],out[maxn],n,m,from,to;

bool vis[maxn];

void add_line(int from,int to)

void tarjan(int u)else

}if(dfn[u]==low[u])

top--;

}}int main()

for(register

int i=1;i<=n;i++) if(!dfn[i]) tarjan(i);

for(register

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

}int final=0;

for(register

int i=1;i<=cnt;i++)

if(out[i]==2) final++;

printf("%d\n",(final+1)>>1);

return

0;}

如果還有不懂的,請自行模擬上面所畫的沙漏

邊雙聯通分量

首先什麼是邊雙聯通分量?邊雙連通分量是指,在 無向圖 中刪除任意一條邊依舊聯通的聯通塊 之前講過強連通分量,這裡邊雙聯通分量的做法也需要利用tarjan演算法獲得邊雙聯通分量。對於邊雙聯通分量中還有乙個概念,就是橋。橋指的是 刪除該邊圖不再連通。對應的另乙個概念是 割點 割點的的是 如果除去此節點和...

邊雙聯通分量

noip最後一次學習 敲板子 橋 如果這條邊去掉後圖的聯通分量增加,則這條邊稱為橋。邊雙聯通分量 如果乙個對於乙個圖的某個子圖,任意兩點至少存在兩條 邊不重複 的路徑,則這個子圖是邊雙聯通分量。很顯然,任意乙個邊雙中不含有橋。除橋外每條邊都僅屬於乙個邊雙。如果把原圖中所有橋刪除,每個聯通分量都是原圖...

邊雙聯通分量與割邊

在圖論中,除了在有向圖中的強連通分量,在無向圖中還有一類雙聯通分量 雙聯通分量一般是指點雙連通分量 當然,還有一種叫做邊雙連通分量 對於乙個連通圖,如果任意兩點至少存在兩條 邊不重複 的路徑,則說圖是點雙連通的,邊雙連通的極大子圖稱為邊雙連通分量。邊雙聯通分量的計算方法比較簡單 模擬tarjan求強...