洛谷2656 採蘑菇

2021-07-10 20:54:12 字數 2323 閱讀 6739

洛谷2656 採蘑菇

題目描述

小胖和zyr要去esqms森林採蘑菇。

esqms森林間有n個小樹叢,m條小徑,每條小徑都是單向的,連線兩個小樹叢,上面都有一定數量的蘑菇。小胖和zyr經過某條小徑一次,可以採走這條路上所有的蘑菇。由於esqms森林是一片神奇的沃土,所以一條路上的蘑菇被採過後,又會長出一些新的蘑菇,數量為原來蘑菇的數量乘上這條路的「恢復係數」,再下取整。

比如,一條路上有4個蘑菇,這條路的「恢復係數」為0.7,則第一~四次經過這條路徑所能採到的蘑菇數量分別為4,2,1,0.

現在,小胖和zyr從s號小樹叢出發,求他們最多能採到多少蘑菇。

對於30%的資料,n<=7,m<=15

另有30%的資料,滿足所有「恢復係數」為0

對於100%的資料,n<=80,000,m<=200,000,0.1<=恢復係數<=0.8且僅有一位小數,1<=s<=n.

輸入輸出格式

輸入格式:

第一行,n和m

第2……m+1行,每行4個數字,分別表示一條小路的起點,終點,初始蘑菇數,恢復係數。

第m+2行,乙個數字s

輸出格式:

乙個數字,表示最多能採到多少蘑菇,在int32範圍內。

輸入輸出樣例

輸入樣例#1:

3 31 2 4 0.5

1 3 7 0.1

2 3 4 0.6

1輸出樣例#1:

8【思路】

強連通分量+最長路。

tarjan演算法求scc+縮點。scc中的結點是可以互相到達的因此scc內部的邊權可以全部獲得,將每條指向scc的邊權加上scc的內部邊權,再求一遍最長路即可。

需要注意的有:

1、記錄f而不要將w提前分解成邊。

2、不要把大陣列開在函式裡面,否則會re =-=。這點學了。

【**】

1 #include2 #include3 #include4 #include5 #include6 #include7

using

namespace

std;89

const

int maxn = 80000+10,maxm=200000+10;10

const

int inf=1

<<30;11

struct

edgee[maxm];

15int en=-1

,front[maxn];

1617

intn,m,s;

1819 stacks;

20int

scc_cnt,dfs_clock;

21int

sccno[maxn],pre[maxn],lowlink[maxn],scc_v[maxn];

22void dfs(int

u) 31

else

if(!sccno[v]) 34}

35if(lowlink[u]==pre[u])

3643}44

}45void find_scc(int

n) 52

5354 inline void addedge(int u,int v,int w,double

f) 57

58struct

spfa

5969

void addedge(int u,int v,int

w) 72

void solve(int

s) 87}88

}89}90

int ans=0;91

for(int i=1;i<=n;i++) ans=max(ans,d[i]);

92 printf("

%d\n

",ans);93}

94};

95spfa spfa;

9697

intmain()

105 scanf("

%d",&s);

106find_scc(n);

107108

spfa.init(scc_cnt);

109110

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

121}

122}

123}

124for(int u=1;u<=n;u++)

131}

132}

133134

spfa.solve(sccno[s]);

135136

return0;

137 }

洛谷 2656 採蘑菇

題目描述 小胖和zyr要去esqms森林採蘑菇。esqms森林間有n個小樹叢,m條小徑,每條小徑都是單向的,連線兩個小樹叢,上面都有一定數量的蘑菇。小胖和zyr經過某條小徑一次,可以採走這條路上所有的蘑菇。由於esqms森林是一片神奇的沃土,所以一條路上的蘑菇被採過後,又會長出一些新的蘑菇,數量為原...

洛谷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...