P3387 模板 縮點 題解 (Tarjan)

2022-06-20 01:51:12 字數 754 閱讀 3750

p3387 【模板】縮點

這幾天搞圖論,好有趣hhh,多寫幾篇部落格。

上次學\(tarjan\)求割點,這次縮點。

思路大概是多乙個棧和染色的步驟,每次\(tarjan\)的時候把點入棧,如果某個點(比較像割點但不完全是)的\(dfs\)子樹都搜不到它祖宗,那麼接下來進行的遍歷操作必然與該點不能形成強連通分量,所以可以遇到\(low[p]==dfn[p]\)的點就把棧裡面的東西全彈出來,染色表示這是乙個強連通分量。

對於這個題,強連通分量之間再進行連邊,記憶化搜尋(類似樹形dp)即可。

#include#include#define n 100010

#define m 10010

#define min(a,b) (a>b?b:a)

#define max(a,b) (aint n,m;

int v[m],x[n],y[n];

struct edgee[n];

int head[m],cnt;

void add(int a,int b)

int dfn[m],tot,sta[m],top,vis[m],low[m];

int color[m],num,val[m];

void tarjan(int p)

if(dfn[p]==low[p]) }}

int f[m];

void dp(int p)

f[p]+=val[p];

}int main()

P3387 模板 縮點

r es ul tresult result h yp erli nk hyperlink hyperl ink de scri ptio ndescription descri ptio n 給定一張n nn個點,m mm條邊的有向圖,點有點權 找出一條路徑使得經過的點的權值和最大,點和邊可以重複...

P3387 模板 縮點

縮點 dp 給定乙個n個點m條邊有向圖,每個點有乙個權值,求一條路徑,使路徑經過的點權值之和最大。你只需要求出這個權值和。允許多次經過一條邊或者乙個點,但是,重複經過的點,權值只計算一次。輸入格式 第一行,n,m 第二行,n個整數,依次代表點權 第三至m 2行,每行兩個整數u,v,表示u v有一條有...

P3387 模板 縮點

題解 qwq論這個題我開了多少陣列qwq 因為每個點走過多次權值只會計算1次 簡化問題 把題目給出的有向圖縮點,成為有向無環圖,然後拓撲排序跑最長路 首先tarjan縮點 然後強連通分量連邊 下面跑拓撲排序,入度為0的強連通分量 first 然後 dis 計算到達這個強連通分量時的最大權值 感覺這裡...