雲裡霧裡學Tarjan(強連通分量)

2022-07-31 03:21:12 字數 1566 閱讀 8707

1、當我已經知道了我要走的下一步節點在棧中,我能不能把比較中的dfn寫成low?

2、如果low[v]>=dfn[u],此時u就是割點,這個東西怎麼證明?

1、全網最!詳!細!tarjan演算法講解

2、割點(tarjan演算法)

↑洛谷有模板

下面是鄙人寫的裸的tarjan求圖中強連通分量的**!

//tarjan基本的演算法實現 

#includeusing namespace std;

struct sdedge[1001];

int dfn[1001],low[1001];

int stk[1001],head[1001],vis[1001],cnt,tot,index,n,m;

void add(int x,int y)

void tarjan(int x)

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

int main()

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

return 0;

} /*

6 81 2

1 42 3

3 62 5

5 64 5

5 1*/

下面是我給出的求割點的tarjan演算法程式。我還是有一些東西沒有搞懂。(帶有注釋)

這裡給一張圖方便理解:(紅色的是dfn,藍色的是low)

例題:p3388 【模板】割點(割頂)

//tarjan演算法求割點,我好像自己也不是很懂

#includeusing namespace std;

const int n=100010;

struct sdedge[2*n];

int head[n],dfn[n],low[n],cnt=0,tot=0,n,m;

bool judge[n];

void add(int x,int y)

void tarjan(int x,int fa)

low[x]=min(low[x],dfn[v]);//?? 判斷回邊因為是無向圖!!!這裡不能改的過於大了不能改成low否則容易出問題!

} if(child>=2&&x==fa)judge[x]=true;

}int main()

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

if(!dfn[i])tarjan(i,i);

int ans=0;

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

if(judge[i])ans++;printf("%d\n",ans);

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

if(judge[i])printf("%d ",i);

return 0;

}

by nj

強連通分量 tarjan

洛谷 p2812 校園網路 洛谷 p3387 縮點 include include include include include using namespace std struct arrbot 1100000 d 1100000 int head 20000 h 20000 stack 200...

強連通分量 tarjan

struct enodeedge maxm int p maxn ec void inserte int u,int v,int w int dfn maxn ctime,low maxn 時間戳,時間戳計數,祖先時間。int gid maxn gc 分量陣列,分量計數。bool ins maxn ...

強連通分量 tarjan

題1 p2002 訊息擴散 題目描述 有n個城市,中間有單向道路連線,訊息會沿著道路擴散,現在給出n個城市及其之間的道路,問至少需要在幾個城市發布訊息才能讓這所有n個城市都得到訊息。輸入輸出格式 輸入格式 第一行兩個整數n,m表示n個城市,m條單向道路。以下m行,每行兩個整數b,e表示有一條從b到e...