题意描述:
N 个草丛,M 条单向的小道,经过每条道时可以采走这条道上的所有蘑菇,蘑菇有一个恢复系数,即在采过这一片蘑菇后又会新长出蘑菇,求从给定的点出发能采到的蘑菇最大值。
算法分析:
很容易想到最后要求一个最大值,可以用树形 DP,不过本人比较懒,推荐 spfa 求最长路,既好理解又好写。
首先明确一点,如果走到一个环中,里面的所有蘑菇包括每一次恢复后新长出来的蘑菇都能采到。
于是想到了什么? Tarjan 缩点,成为一个有向无环图,把每一个强连通分量里面的蘑菇总数求出来,最后跑一边最长路即可。
然后要注意细节:这道题不需要用 double 存,会有精度问题。可以在存图的时候先把 k 乘 10,在后面的处理中把 k 除以 10 就行了。
代码+注释:
#include<bits/stdc++.h>
using namespace std;
inline int read(){ //快读不解释了
int x=0,f=1;char ch=getchar();
while(ch<'0'||ch>'9'){if(ch == '-') f=-1 ; ch=getchar();}
while(ch>='0