tarjan演算法:
1:low[maxn]:乙個節點的dfn值=同乙個連通分量中這個節點可以回到的最小時間戳
2:dfn[maxn]:按照dfs的順序訪問到該節點的時間戳
3:對乙個節點來講:
1:如果沒有被訪問過,即先對其遞迴呼叫tarjan函式,然後計算這個節點的上乙個節點,即這條邊的from節點的low,這裡要注意一下這是乙個回溯的過程,因為想象一下在圖中,是先一直遞迴到乙個節點沒有下乙個節點為止的,因此是先算出沒有下乙個節點的那個節點的low==dfn,一開始對乙個節點來講,本身就是乙個單獨的連通分量,也預設該節點的dfn值=同乙個連通分量中這個節點可以回到的最小時間戳,即low==dfn,然後遞迴函式的回溯過程中,其上乙個節點的low值的求法為:
if(!dfn[v])
else if(vis[v])
#include using namespace std;
const int maxn=2e5+7;
vectore[maxn];
int dfn[maxn],low[maxn],tot,n,ans=maxn,vis[maxn];
stacks;
void tarjan(int x)
}int main()
for(int i=1;i<=n;i++)
}cout
}
強連通分量Tarjan演算法
o v e 通常的tarjan寫法是有個dfn陣列跟乙個instack陣列,我精簡了下 把這兩個陣列都刪去了,用更簡便的寫法代替,也省了空間。int low maxn 記錄這棵樹能到達的最早祖先 其實不一定是最早,但不影響使用 int time 時間戳 int num 連通分量的個數 int bel...
強連通分量 tarjan演算法
強連通分量 tarjan演算法 有向圖強連通分量 在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected com...
強連通分量 Tarjan演算法
有向圖強連通分量 在有向圖g中,如果兩個頂點vi,vj間 vi vj 有一條從vi到vj的有向路徑,同時還有一條從vj到vi的有向路徑,則稱兩個頂點強連通。如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。有向圖的極大強連通子圖,稱為強連通分量。tarjan 演算法是基於對圖優先搜素的演算法 每...