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...