1. 程式人生 > >有向圖的強連通子圖&2次DFS

有向圖的強連通子圖&2次DFS

為什麽 com 說明 節點 結點 bubuko 之間 強連通分量 time

第一次DFS是正常順序;第二次將edge反向,然後從Finish time最後的點開始DFS。

如下分別是兩次DFS。

技術分享圖片

技術分享圖片

逆序即以b為源節點開始,會得到b->a->e; c->d; g->f; h;四棵子樹,即四個強連通分量。

現在解釋一下為什麽要先反向?

以C結點為例,圖未反向時,我們從C能遍歷到的結點有,c->g->h->f->d。

圖反向後,我們從C能遍歷到的結點有,c->d。(註意圖反向後,我們是從b開始DFS的)從這裏我們可以看出c,d就是一個強連通子圖。因為從c的正向出發可以到達d,從反向出發也能到達d,那就說明c,d之間兩兩都有路徑。

所以我們發現,c->d,而反向後c->d說明d->c,說明c,d是一個強連通分量。相當於反向前和反向後求交集。

有向圖的強連通子圖&2次DFS