tarjan求強連通分量
在乙個有向圖中,如果某兩點間都有互相到達的路徑,那麼稱中兩個點強聯通,如果任意兩點都強聯通,那麼稱這個圖為強聯通圖;乙個有向圖的極大強聯通子圖稱為強聯通分量。
演算法可以在
的時間內求出乙個圖的所有強聯通分量。
表示進入結點
的時間
表示從所能追溯到的棧中點的最早時間
如果某個點
已經在棧中則更新
否則對進行回溯,並在回溯後更新
#include#includetarjan求割點#include
#include
#include
#include
#include
using
namespace
std;
intn,m,tot,ind,ans;
int dfn[200005],low[200005],last[200005
];bool ins[200005
];stack
s;struct
hhe[
500005
];void add(int fr,int
to)void tarjan(int
now)
else
if(ins[e[i].to])low[now]=min(low[now],dfn[e[i].to]);
if(dfn[now]==low[now])
while(j!=now);
ans=max(ans,cnt);
}}int
main()
for(i=1;i<=n;i++)
if(!dfn[i]) tarjan(i);
printf("%d
",ans);
return0;
}
在乙個無向圖中,如果刪掉點
後圖的連通塊數量增加,則稱點
為圖的割點。
對於搜尋樹上的非根結點
,如果存在子節點
滿足,即
向上無法達到
的祖先,則
為割點。
對於搜尋樹上的根節點
,若它的子節點數
,則為割點。
void tarjan(int x,inttarjan求割邊fa)
else
if(e[i].to!=fa) low[x]=min(low[x],dfn[e[i].to]);}}
對於當前結點
,若鄰接點中存在結點
滿足,則
為割邊。
void tarjan(int x,intfa) }
}
強連通分量 tarjan求強連通分量
雙dfs方法就是正dfs掃一遍,然後將邊反向dfs掃一遍。挑戰程式設計 上有說明。雙dfs 1 include 2 include 3 include 4 include 5 6using namespace std 7const int maxn 1e4 5 8 vector g maxn 圖的鄰...
強連通分量 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 ...