vijosP1285 佳佳的魔法药水

链接:https://vijos.org/p/1285

【思路】

图论思想。

很巧妙。

如A+B=C,将AB之间连边,边权为C,用以找相连物品与合成物。

用Dijkstra的思想:找最小价值,如果相连物品中有已经得出最小价值的则共同更新其合成物。

对于方案数用乘法原理在更新的时候顺便计算。

【代码】

 #include<iostream>
#include<cstring>
#include<cstdio>
using namespace std; const int maxn = +;
const int INF=<<; int G[maxn][maxn],d[maxn],vis[maxn];
int tot[maxn];
int n; int main(){
ios::sync_with_stdio(false);
cin>>n;
for(int i=;i<n;i++) cin>>d[i]; for(int i=;i<n;i++)
{
tot[i]=;
for(int j=;j<n;j++) G[i][j]=-;
} int u,v,w;
while(cin>>u>>v>>w) {
G[u][v]=G[v][u]=w;
}
for(int i=;i<n;i++) {
int _min=INF,k;
for(int j=;j<n;j++) if(!vis[j] && d[j]<_min) _min=d[k=j];
if(_min==INF) break;
vis[k]=;
for(int j=;j<n;j++) if(vis[j] && G[k][j]>=) //注意是vis[j]//寻找已经得到最小价值的更新其合成物
if(d[G[k][j]]>d[k]+d[j]) {
d[G[k][j]]=d[k]+d[j];
tot[G[k][j]]=tot[k]*tot[j];
}
else
if(d[G[k][j]]==d[k]+d[j])
tot[G[k][j]] += tot[k]*tot[j];
}
cout<<d[]<<" "<<tot[]<<"\n";
return ;
}

最新文章

  1. Redis设计与实现读书笔记(一) SDS
  2. 轻松掌握:JavaScript组合模式
  3. 系统吞吐量(TPS)、用户并发量
  4. 使用 Flash Builder 的 Apple iOS 开发过程
  5. code manager tools svn服务安装配置
  6. linux之Gcc使用
  7. Java 8:如何使用流方式查询数据库?
  8. 【甘道夫】HBase连接池 -- HTablePool是Deprecated之后
  9. 文件系统与linux相关知识点
  10. Java中File
  11. python基础之文件操作和函数
  12. Windows邮件客户端
  13. HTTP 协议中 GET 和 POST 方法详解
  14. IE的“浏览器模式”和“文档模式的区别”
  15. MFC命名规范
  16. iOS开发-iOS7禁用手势返回
  17. VC消息传递(对话框间传递参数)
  18. 2018.09.16 bzoj1086: [SCOI2005]王室联邦(贪心)
  19. 《设计模式》-原则四:接口隔离原则(ISP)
  20. IIS6.0应用程序池回收(转载)

热门文章

  1. Android工程师必会做的20道题
  2. maven 创建的符号连接命令
  3. java经典题目练习-第八题简单实现方式...
  4. HDU 3006 The Number of set(位运算 状态压缩)
  5. [学习笔记]设计模式之Decorator
  6. 开发中遇到的angularJs的小问题
  7. jQuery提供的小方法
  8. iOS: XCode6 beta 6 错误
  9. C# mvc 验证码3
  10. 跨平台的WatiForSingleObject实现