vijosP1285 佳佳的魔法药水
生活随笔
收集整理的這篇文章主要介紹了
vijosP1285 佳佳的魔法药水
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
vijosP1285 佳佳的魔法藥水
?
鏈接:https://vijos.org/p/1285
?
【思路】
? 圖論思想。
? 很巧妙。
? 如A+B=C,將AB之間連邊,邊權為C,用以找相連物品與合成物。
? 用Dijkstra的思想:找最小價值,如果相連物品中有已經得出最小價值的則共同更新其合成物。
? 對于方案數用乘法原理在更新的時候順便計算。
【代碼】
?
1 #include<iostream> 2 #include<cstring> 3 #include<cstdio> 4 using namespace std; 5 6 const int maxn = 1000+10; 7 const int INF=1<<30; 8 9 int G[maxn][maxn],d[maxn],vis[maxn]; 10 int tot[maxn]; 11 int n; 12 13 int main(){ 14 ios::sync_with_stdio(false); 15 cin>>n; 16 for(int i=0;i<n;i++) cin>>d[i]; 17 18 for(int i=0;i<n;i++) 19 { 20 tot[i]=1; 21 for(int j=0;j<n;j++) G[i][j]=-1; 22 } 23 24 int u,v,w; 25 while(cin>>u>>v>>w) { 26 G[u][v]=G[v][u]=w; 27 } 28 for(int i=0;i<n;i++) { 29 int _min=INF,k; 30 for(int j=0;j<n;j++) if(!vis[j] && d[j]<_min) _min=d[k=j]; 31 if(_min==INF) break; 32 vis[k]=1; 33 for(int j=0;j<n;j++) if(vis[j] && G[k][j]>=0) //注意是vis[j]//尋找已經得到最小價值的更新其合成物 34 if(d[G[k][j]]>d[k]+d[j]) { 35 d[G[k][j]]=d[k]+d[j]; 36 tot[G[k][j]]=tot[k]*tot[j]; 37 } 38 else 39 if(d[G[k][j]]==d[k]+d[j]) 40 tot[G[k][j]] += tot[k]*tot[j]; 41 } 42 cout<<d[0]<<" "<<tot[0]<<"\n"; 43 return 0; 44 }?
總結
以上是生活随笔為你收集整理的vijosP1285 佳佳的魔法药水的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搭数字(字符串)
- 下一篇: 三岁小屁孩眼中的中国房价