好題. 一開始一直在想怎麼蛇皮建圖,但是發現一直蛇不出來...
正解是用類似於 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 號藥 水呢?你要知道佳佳的家境也不是很好,成本得足夠低才行 題目描述 得到一種藥水有兩種方法 可以按照魔法書上的指導自己配置,...