洛谷
如果圖是乙個\(dag\),我們可以任意選擇若干個不是入度為\(0\)的點,然後把它們按照拓撲序倒序刪掉,不難證明這樣一定是合法的。
現在的問題是出現了\(scc\),我們縮點之後\(scc\)形成了乙個\(scc\),我們還是貪心考慮,顯然不是入度為\(0\)的\(scc\)仍然可以類似上面的任意刪點,只需要按照\(scc\)的拓撲序倒序處理,對於入度為\(0\)的\(scc\),至少要留下乙個點,那麼這樣子就可以判斷了。
#include#include#include#includeusing namespace std;
#define max 500500
inline int read()
vectore[max];
int dfn[max],low[max],tim,g[max],gr,sz[max],dg[max];
int st[max],top;bool ins[max];
void tarjan(int u)
while(u!=v); }}
int n,m,k,ans,a[max],p[max];
bool cmp(int x,int y)
int main()
printf("%d\n",ans);
return 0;
}
洛谷P5008 逛庭院 tarjan縮點 貪心
首先我們看到資料範圍。媽耶!資料這麼大,一開始還想用個dp來做,但是看著就不行,那麼根據這個資料範圍,我們大致可以猜到這道題的演算法是乙個貪心,那麼我們怎麼貪呢?我們首先還是先畫乙個圖 樣例解釋一下 我們取的點是 3 5 7 看到題目,因為 1 號節點的入度為0,那麼就一定不能選擇 1 號節點,那麼...
luogu5008 逛庭院 tarjan縮點
首先如果這是乙個dag,我按照拓撲序倒著去選,一定能選到所有入度不為0的點 然後考慮有環的情況 我們拎出來乙個強連通分量 先假設它縮點以後是沒有入度的 那我最後它裡面一定至少剩乙個不能選 因為就剩乙個的時候肯定沒有入度呀 那我顯然可以把它看成是乙個只有乙個點入度為0的dag 而且那個入度為0的點可以...
Tarjan模板 洛谷P2921
傳送門 上 先佔坑,我去打打noip2018 滑稽 好了好了回來了,noip太難了,做不動。tarjan是用來求強連通分量的演算法。應用十分廣泛。tarjan演算法就不證明了,有興趣的可以去網上看大神們的各種證明。主要是我也不會證明啊 隨便講講tarjan怎麼寫的吧。low和dfn是最重要的兩個陣列...