P1875 佳佳的魔法藥水 最短路,DP

2022-04-30 09:42:09 字數 936 閱讀 3123

好題. 一開始一直在想怎麼蛇皮建圖,但是發現一直蛇不出來...

正解是用類似於 dijkstra 的演算法對所有點進行鬆弛.

對於每個元素記錄兩個值:

似乎可以發現我們存合併狀態的陣列很像臨接矩陣?

然後就可以開始蛇了...

我們對於每一瓶藥水,其 \(cost\) 初值為其直接買的花費.

\(ans\) 初值為 1.

每一次選擇未鬆弛的**最小的藥水\(u\),然後對於所有的 \(f_\) 值進行更新.

\(1.\) 如若 \(cost_}>cost_u+cost_i\)

那麼 \(cost_}=cost_u+cost_i\),同時 \(ans_}=ans_u*ans_i\)

\(2.\) 如果 \(cost_}=cost_u+cost_i\)

那麼 \(ans_}=ans_}+ans_u*ans_i\)

然後最後的答案即為 \(cost[0]\)以及 \(ans[0]\).

#includeusing namespace std;

const int inf=192608173;

const int maxn=1008;

int f[maxn][maxn],n;

int cost[maxn],ans[maxn];

void dijkstra()

,k,minimum;

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

else if(cost[f[j][k]]==cost[j]+cost[k])

ans[f[j][k]]+=ans[j]*ans[k];

}} int main()

//此處建邊.

for(int i=0;ians[i]=1;

dijkstra();

cout

}

P1875 佳佳的魔法藥水

題意 給出0 n 1號藥水的價錢 我們要用最少的錢買0號藥水 題目中會給出某兩種藥水的融合品 讓我們找出最少花的錢和方案數 思路 一開始做這道題的時候,想到的肯定就是最短路了,於是我朝著spfa方面想 可是,我在建圖方面並不知道怎麼建。想了大概乙個小時也不知道如何建圖 然後看了別人的題解,發現很多人...

洛谷 P1875 佳佳的魔法藥水

p1875 佳佳的魔法藥水 題目描述 發完了 k 張 佳佳卻得到了乙個壞訊息 他的 mm 得病了!佳佳和大家一樣焦急 萬分!治好 mm 的病只有一種辦法,那就是傳說中的 0 號藥水 怎麼樣才能得到 0 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 題目描述 得到一種藥水有兩種方法 可以...

洛谷 P1875 佳佳的魔法藥水

題目描述 發完了 k 張 佳佳卻得到了乙個壞訊息 他的 mm 得病了!佳佳和大家一樣焦急 萬分!治好 mm 的病只有一種辦法,那就是傳說中的 0 號藥水 怎麼樣才能得到 0 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 題目描述 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,...