Tarjan模板 洛谷P2921

2021-08-31 16:10:15 字數 1118 閱讀 1203

傳送門:

上**先佔坑,我去打打noip2018(滑稽)

好了好了回來了,noip太難了,做不動。

tarjan是用來求強連通分量的演算法。應用十分廣泛。

tarjan演算法就不證明了,有興趣的可以去網上看大神們的各種證明。(主要是我也不會證明啊)

隨便講講tarjan怎麼寫的吧。

low和dfn是最重要的兩個陣列。

low作為每個點在這顆樹中的,最小的子樹的根,每次保證最小。dfn是時間戳,記錄now結點從起點訪問的步數。

還要有乙個stacks記錄結點,如果棧裡面有兩個相同的結點,表示他們之間的結點全部都是強連通分量的結點。

%染色%

既然tarjan可以求強連通分量,那麼我們就可以把圖中的環全部染成相同的顏色,顏色相同的一堆看作乙個結點。這個過程叫做縮點。然後就可以把有環的圖轉化成無環的圖啦。

那麼如果要求圖中的最小環,那不就是圖中的染色面積最小的那個嘛(不算1)。

講講這個題吧,快忘記這個題目的存在了。

對於每一頭牛,如果這頭牛在環裡,那麼他的結果就是環的大小。

如果這頭牛不在環裡,那麼就是這頭牛到環的距離+環的大下。

main函式裡寫了這麼多for,相信大家可以看懂(也沒人看我的題解吧)。

#include using namespace std;

const int maxn = 2e5+7;

int nxt[maxn];

int ans[maxn];

int color[maxn];

int sum[maxn],vis[maxn];

int low[maxn],dfn[maxn];

vectorg[maxn];

stacks;

int cnt = 0;

int col = 0;

void tarjan(int x)

for(int i=1;i<=n;i++) }

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

for(int i=1;i<=n;i++)

return 0;

}

小學數學題 洛谷p2921

露公尺婭 我來先考你一道小學數學題吧!琪露諾 好!小學的題我肯定都會!露公尺婭 有 n n n 只妖精要跨過霧之湖,由於湖邊大霧瀰漫,妖精們看不清湖到底有多大,不想從邊上繞過去。湖上有一條船個傳送器,且這個傳送器每次只能載 r r r 只妖精跨過湖面 注意傳送器可以同時把兩側的妖精分別運到對岸,但每...

洛谷 P3388 模板 割點 割頂 tarjan

題目鏈結 題意 給出乙個n個點m條邊的無向圖,求其割點。思路 tarjan求割點模板題。tarjan 求割點 遍歷整個圖,則整個圖可轉化為一棵樹 附帶著有回邊 設定兩個陣列,dfn i 記錄搜尋到i的時間 low i 記錄在i的子樹中通過非父子邊能夠遍歷到的最早的dfn 那麼如何判斷乙個點是否是割點...

洛谷P3388 模板 割點(Tarjan 割點)

給出乙個nn個點,mm條邊的無向圖,求圖的割點。第一行輸入n,mn,m 下面mm行每行輸入x,yx,y表示xx到yy有一條邊 第一行輸出割點個數 第二行按照節點編號從小到大輸出節點,用空格隔開 輸入6 7 1 21 3 1 42 5 3 54 5 5 6 輸出1 5 對於全部資料,n 20000,m...