就是找到所有強連通分量然後縮點,得到dag。
設a為dag入度為零的點的個數,b為dag出度為零的點的個數。
答案就是max(a,b)
當dag只有乙個點時特判輸出0。
注意一些細節,就是縮點建圖時不但要判斷邊的兩端是否在同乙個強連通分量內,還要判斷是否已經使用過(即避免重邊)。
還有一些手誤,以後應該注意。
**#include#define rep(i,a,b) for(int i=a;i<=b;i++)
using namespace std;
const int maxn = 20010;
const int maxm = 50010;
int pre[maxn],lowlink[maxn],sccno[maxn],dfs_clock,scc_cnt;
vectorg[maxn];
stacks;
void dfs(int u)
{ pre[u]=lowlink[u]=++dfs_clock;
s.push(u);
for(unsigned int i=0;i
強連通分量 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演算法求強連通分量。define n 1000 struct edge e 100000 int ec,p...
強連通分量
在有向圖g中,如果兩個頂點間至少存在一條路徑,稱兩個頂點強連通 strongly connected 如果有向圖g的每兩個頂點都強連通,稱g是乙個強連通圖。非強連通圖有向圖的極大強連通子圖,稱為強連通分量 strongly connected components 下圖中,子圖為乙個強連通分量,因為...