洛谷 P1875 佳佳的魔法藥水

2021-07-30 12:58:22 字數 2006 閱讀 5789

p1875 佳佳的魔法藥水

題目描述

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

題目描述:

得到一種藥水有兩種方法:可以按照魔法書上的指導自己配置,也可以到魔法商店裡去

買——那裡對於每種藥水都有**,雖然有可能**很貴。在魔法書上有很多這樣的記載:

1 份 a 藥水混合 1 份 b 藥水就可以得到 1 份 c 藥水。(至於為什麼 1+1=1,因為……這是魔

法世界)好了,現在你知道了需要得到某種藥水,還知道所有可能涉及到的藥水的**以及

魔法書上所有的配置方法,現在要問的就是:1.最少花多少錢可以配製成功這種珍貴的藥水;

2.共有多少種不同的花費最少的方案(兩種可行的配置方案如果有任何乙個步驟不同則視為 不同的)。假定初始時你手中並沒有任何可以用的藥水。

輸入輸出格式

輸入格式:

第一行有乙個整數 n,表示一共涉及到的藥水總數。藥水從 0~n­1 順序編號,0 號藥水就是 最終要配製的藥水。

第二行有 n 個整數,分別表示從 0~n­1 順序編號的所有藥水在魔法商店的**(都表示 1 份的**)。

第三行開始,每行有 3 個整數 a、b、c,表示 1 份 a 藥水混合 1 份 b 藥水就可以得到 1 份 c 藥水。注意,某兩種特定的藥水搭配如果能配成新藥水的話,那麼結果是唯一的。也就是 說不會出現某兩行的 a、b 相同但 c 不同的情況。

輸入以乙個空行結束。

輸出格式:

輸出兩個用空格隔開的整數,分別表示得到 0 號藥水的最小花費以及花費最少的方案的個

數。輸入輸出樣例

輸入樣例#1

7 10 5 6 3 2 2 3

1 2 0

4 5 1

3 6 2

輸出樣例#1

10 3

說明

樣例說明:

最優方案有 3 種,分別是:直接買 0 號藥水;買 4 號藥水、5 號藥水配製成 1 號藥水,直接 買 2 號藥水,然後配製成 0 號藥水;買 4 號藥水、5 號藥水配製成 1 號藥水,買 3 號藥水、6 號藥水配製成 2,然後配製成 0。

這個題用dijistra跑一遍最短路

map[i][j]=k表示i和j兩種藥水可以配出k藥水

因為要用i藥水配出k藥水就必須有j藥水,所以要從i走到k就必須再加上dis[j]。最後答案儲存在dis[1]中

然後就是方案個數,由於k藥水是由i和j兩種藥水配成的,所以k藥水的方案個數cnt[k]應該是cnt[i]*cnt[j],如果出現了配成某種藥水的**重複且最小,就把方案數累加

#include#include

using

namespace

std;

int cnt[1100],n,dis[1100],map[1100][1100

];bool vis[1100

];void

dijistra()

}if(ds==0x3fffffff)break

; vis[nxt]=1

;

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

else

if(dis[map[j][nxt]]==dis[j]+ds)}}

}int

main()

dijistra();

printf(

"%d %d

",dis[1],cnt[1

]);}

洛谷 P1875 佳佳的魔法藥水

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

洛谷P1875 佳佳的魔法藥水

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

P1875 佳佳的魔法藥水

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