vijosP1285 佳佳的魔法药水
2024-08-20 23:25:19
vijosP1285 佳佳的魔法药水
【思路】
图论思想。
很巧妙。
如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 ;
}
最新文章
- Redis设计与实现读书笔记(一) SDS
- 轻松掌握:JavaScript组合模式
- 系统吞吐量(TPS)、用户并发量
- 使用 Flash Builder 的 Apple iOS 开发过程
- code manager tools svn服务安装配置
- linux之Gcc使用
- Java 8:如何使用流方式查询数据库?
- 【甘道夫】HBase连接池 -- HTablePool是Deprecated之后
- 文件系统与linux相关知识点
- Java中File
- python基础之文件操作和函数
- Windows邮件客户端
- HTTP 协议中 GET 和 POST 方法详解
- IE的“浏览器模式”和“文档模式的区别”
- MFC命名规范
- iOS开发-iOS7禁用手势返回
- VC消息传递(对话框间传递参数)
- 2018.09.16 bzoj1086: [SCOI2005]王室联邦(贪心)
- 《设计模式》-原则四:接口隔离原则(ISP)
- IIS6.0应用程序池回收(转载)