日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

洛谷 P1875 佳佳的魔法药水(最短路) 题解

發布時間:2023/12/15 编程问答 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 洛谷 P1875 佳佳的魔法药水(最短路) 题解 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

題目來源:

https://www.luogu.org/problemnew/show/P1875

題目描述:

題目背景

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

題目描述

得到一種藥水有兩種方法:可以按照魔法書上的指導自己配置,也可以到魔法商店里去 買——那里對于每種藥水都有供應,雖然有可能價格很貴。在魔法書上有很多這樣的記載:

1 份 A 藥水混合 1 份 B 藥水就可以得到 1 份 C 藥水。(至于為什么 1+1=1,因為……這是魔 法世界)好了,現在你知道了需要得到某種藥水,還知道所有可能涉及到的藥水的價格以及 魔法書上所有的配置方法,現在要問的就是:1.最少花多少錢可以配制成功這種珍貴的藥水;

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

輸入輸出格式

輸入格式:

?

第一行有一個整數 N(N<=1000),表示一共涉及到的藥水總數。藥水從 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。

解題思路:

?

? ? ? ?這題就是,一個求最短路和最短路計數的問題,但是一開始用spfa計數一直出錯,不懂為什么,好像spfa的計數和dij的不一樣,所以,我就改成用數組模擬的dij了,對可以配制成c藥水的a和b,建邊tu【a】【b】=c;然后就是最短路松弛操作了;

不過在計數的時候,因為有兩種藥水配成的,a藥水有x種方法,b藥水有y種方法,那合成c藥水應該有a*b種,這樣就行了。。

代碼:

#include <iostream> #include <iomanip> #include <cstdio> #include <cstring> #include <string> #include <vector> #include <map> #include <algorithm> #include <queue> #include <stack> #include <cmath> #define inf 0x3f3f3f3f #define ll long long using namespace std; const int maxn=1e6+10; int n,vis[1010],cs[1010]; int fy[1010],tu[1010][1010]; int main() {memset(tu,-1,sizeof(tu));scanf("%d",&n);for(int i=0;i<n;i++){scanf("%d",&fy[i]);cs[i]=1;}int a,b,c;while(scanf("%d%d%d",&a,&b,&c)!=EOF){tu[a][b]=c;tu[b][a]=c;} for(int i=0;i<n-1;i++){int t=inf,bj;for(int j=0;j<n;j++){if(!vis[j]&&fy[j]<t){bj=j;t=fy[j];}}vis[bj]=1;for(int j=0;j<n;j++){if(vis[j]&&tu[j][bj]!=-1){if(fy[tu[j][bj]]>fy[j]+fy[bj]){fy[tu[j][bj]]=fy[j]+fy[bj];cs[tu[j][bj]]=cs[bj]*cs[j];}else if(fy[tu[j][bj]]==fy[j]+fy[bj])cs[tu[bj][j]]+=cs[j]*cs[bj];}}}printf("%d %d\n",fy[0],cs[0]);return 0; }

?

總結

以上是生活随笔為你收集整理的洛谷 P1875 佳佳的魔法药水(最短路) 题解的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。