每日一題 P2656 採蘑菇 強連通縮點 樹形dp

2021-10-19 12:30:05 字數 1374 閱讀 1281

藍題,思路不算很難,題意可知強連通塊上每條邊的值都可一壓榨乾淨,其他邊最多走一次。因此先縮點,連通塊內所有邊的值先算出來,然後再重新構圖,這時候是個無環圖,跑一邊動態規劃輸出最大值即可。

#include

#define int long long

#define endl "\n"

#define maxn 1000005

using

namespace std;

struct edge

edge[maxn]

;int head[maxn]

,ptr;

void

add_edge

(int u,

int v,

int w,

double co)

int n,m,s;

int belong[maxn]

,scc;

int val[maxn]

;int dfn[maxn]

,low[maxn]

;int idx;

bool in_stk[maxn]

;stack<

int> stk;

void

tarjan

(int now)

else

if(in_stk[to]

) low[now]

=min

(low[now]

,dfn[to]);

}if(dfn[now]

==low[now]

)while

(temp!=now);}

}struct e

e[maxn]

;int

get(

int p)

void

dfs(

int now)

}signed

main()

cin>>s;

tarjan

(s);

ptr=0;

memset

(head,0,

sizeof

(head));

memset

(edge,0,

sizeof

(edge));

for(

int i=

1;i<=m;i++

)add_edge

(u,v,w,0)

;}dfs(belong[s]);

int ans=0;

for(

int i=

1;i<=scc;i++

) ans=

max(ans,val[i]);

cout<}

洛谷P2656 採蘑菇

include include include include include include using namespace std struct inter 200040 double hui 200040 bool flag 80080 int n,m,x,y,z,s,ans 80080 f1...

洛谷 P2656 採蘑菇(Tarjan縮點,dp)

對於每一條路,很顯然只有兩種情況,一種是走一次,一種是走無限次,而第二種情況的條件是這條邊在乙個環中。所以先用tarjan縮點,每個點的權值更新為這個環上所有邊一直摘的蘑菇數的和。然後跑一邊既有邊權也有點權的dag上的dp即可。資料有鍋,後四個點答案有誤,用double存實際上錯了,但是標程是dou...

暑假集訓每日一題 0725 (強連通分量)

n個學校之間有單向的網路,每個學校得到一套軟體後,可以通過單向網路向周邊的學校傳輸。問題1 初始至少需要向多少個學校發放軟體,使得網路內所有的學校最終都能得到軟體。問題2 至少需要新增幾條傳輸線路 邊 使任意向乙個學校發放軟體後,經過若干次傳送,網路內所有的學校最終都能得到軟體。輸入有多組樣例,大約...