給定乙個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,那麼我們至少需要新增...