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

2022-02-13 11:45:46 字數 1109 閱讀 1287

對於每一條路,很顯然只有兩種情況,一種是走一次,一種是走無限次,而第二種情況的條件是這條邊在乙個環中。

所以先用tarjan縮點,每個點的權值更新為這個環上所有邊一直摘的蘑菇數的和。

然後跑一邊既有邊權也有點權的dag上的dp即可。

//資料有鍋,後四個點答案有誤,用double存實際上錯了,但是標程是double,為了過題只能改成double了。

具體原因請看這篇部落格:關於float、double小項問題

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

using

namespace

std;

8const

int maxn=80008;9

const

int maxm=200005;10

int n,m,scc_cnt,cnt,p[maxn][2

],dp[maxn],w[maxn];

11int

sscc[maxn],dfn[maxn],low[maxn],times,num[maxn],ss;

12 stacks;

13struct

nodee[maxm][2

];16

void insert(int u,int v,int value,int sum,int

id)24

void dfs(int

u)else

if(num[v]==0)35

}36if(dfn[u]==low[u])44}

45}46void dfs2(int

u)54}55

intmain()

5668 insert(u,v,vv,sum,0

);69

}70 cin>>ss;

71for(int i=1;i<=n;i++) if(!dfn[i]) dfs(i);

72 cnt=0;73

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

82}83dfs2(num[ss]);

84 cout<85return0;

86 }

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

洛谷2656 採蘑菇

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

洛谷 2656 採蘑菇

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