學習筆記 縮點 tarjan

2021-09-24 18:17:50 字數 892 閱讀 2777

給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。

允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。

顯然,如果選取了乙個點,那麼和這個點在乙個強連通分量裡的點都會被選取,因為點權都是正的,那麼我們就找出所有的強連通分量,把乙個強連通分量縮成乙個點,再跑記搜就可以了

之前在解決割點問題時已經介紹過這種演算法了,沒錯,這種演算法也可以求縮點,之前說過,核心是維護low和dfn陣列,這裡我們也是一樣

顯然,如果low[i]=dfn[i]那麼i點一定與它的某乙個兒子在同一強連通分量裡,我們可以用乙個棧來維護

對於單個點,本身就是乙個強連通分量

找完強連通分量之後,我們重新建圖,所以要把原來邊的資訊儲存下來,如果2個點不在同一強連通分量裡,就建一條邊,之後就是記憶化搜尋

#include#define v a[i].to

using namespace std;

int n,m,x[100010],y[100010],head[10010],cnt,low[10010],dfn[10010],bl[10010],scc,sz[10010],f[10010],ans,sum[10010],val[10010];

stacks;

struct edgea[200010];

void add(int x,int y),head[x]=cnt;}

void dfs(int u)

if(dfn[u]==low[u])

}}void search(int u)

f[u]+=maxx;

}int main()

printf("%d",ans);

return 0;

}

Tarjan縮點 SPFA 縮點

洛谷p3387縮點 tarjan spfa求dag上單源最短路模板題 用tarjan在原圖上求scc 縮點 用縮點之後的scc建乙個有向無環圖 scc權為此scc內所有點點權和 在新建的dag上將scc權視為邊權跑spfa 求scc 1 到scc n 的最長路即為所求答案 include inclu...

學習 模板 tarjan縮點

我美好的早上就被tarjan毀掉了 微笑 放資料qwq謝謝你們讓我學會了tarjan 前兩個還是讓我了解了tarjan而最後乙個可就厲害了還讓我鞏固了topo sort dag 上的dp!學習筆記詳見注釋quq 1 include2 include3 include4 define maxn 100...

Tarjan演算法 縮點

我們這一篇是在已經了解tarjan演算法的基礎之上開始寫的,如果不了解的話,請先看大牛們 關於tarjan演算法的部落格。首先我們對於乙個有向無環的圖 dag 至少新增幾條邊才能使它變為強連通圖?我們很容易根據有向無環圖的性質得到,我們計算入度為零的點數為a,出度為零的點數為b,那麼我們至少需要新增...