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