o ( v+e )
通常的tarjan寫法是有個dfn陣列跟乙個instack陣列,我精簡了下**,把這兩個陣列都刪去了,用更簡便的寫法代替,也省了空間。
int low[maxn]; // 記錄這棵樹能到達的最早祖先(其實不一定是最早,但不影響使用)
int time; // 時間戳
int num; // 連通分量的個數
int belong[maxn]; // 記錄屬於哪個連通分量
int sta[maxn]; // 手寫棧
int top; // 棧頂
void init()
void tarjan(int p)
else if(belong[next]==-1) // 還在棧內 (只要出棧了,belong的值肯定已經確定了,這種判斷方式就省了instack陣列了)
low[p]=min(low[p],low[next]);
}if(low[p]==t)
num++;
}}void solve()
強連通分量 tarjan演算法
強連通分量 tarjan演算法 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected com...
強連通分量 Tarjan演算法
有向圖強連通分量 在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。tarjan 演算法是基於對圖優先搜素的演算法 每...
強連通分量 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 圖的鄰...