博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
【vijos】【树形dp】佳佳的魔法药水
阅读量:5024 次
发布时间:2019-06-12

本文共 1496 字,大约阅读时间需要 4 分钟。

描述

得到一种药水有两种方法:可以按照魔法书上的指导自己配置,也可以到魔法商店里去买——那里对于每种药水都有供应,虽然有可能价格很贵。在魔法书上有很多这样的记载: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号药水的最小花费以及花费最少的方案的个数。

代码

#include 
#include
#include
#include
#define maxn 1100using namespace std;struct edge{ int a,b; edge(int a=0,int b=0){ this->a=a; this->b=b; }};struct node{ int num,dist; node(int num=0,int dist=0){ this->num=num; this->dist=dist; }};bool operator < (const node &a,const node &b){ if(a.dist==b.dist) return a.num>b.num; else return a.dist>b.dist;}int n,c[maxn],dist[maxn],x,y,z,path[maxn];vector
g[maxn];bool vis[maxn];void dijkstra(){ priority_queue
q; memset(vis,0,sizeof(vis)); for(int i=0;i
=dist[a]+dist[cur]){ q.push(node(b,dist[b])); if(dist[b]==dist[a]+dist[cur]) path[b]+=path[a]*path[cur]; else path[b]=path[a]*path[cur]; dist[b]=dist[a]+dist[cur]; } } }}int main(){ //freopen("in.txt","r",stdin); scanf("%d",&n); for(int i=0;i

转载于:https://www.cnblogs.com/leotan0321/p/6081398.html

你可能感兴趣的文章
开博了
查看>>
利用Jenkins自动部署工具间接构建kettle的调度平台
查看>>
关于 '0' === 0 浅析
查看>>
初始化mysql数据库时提示字符编码错误的解决办法
查看>>
python+selenium商城UI自动化
查看>>
使用参数和接收表单数据
查看>>
Android学习小记
查看>>
UML类图解析
查看>>
七牛 js 上传 解决没有文件名
查看>>
【iOS】设备系统版本
查看>>
java中的IO操作总结(三)
查看>>
onCreate中的savedInstanceState有何具体作用
查看>>
Caffe : Layer Catalogue(1)
查看>>
硬件(MAC)地址的概念及作用
查看>>
mybatis使用序列批量插入数据
查看>>
Java线程-- 线程池
查看>>
适时放手,是对自己的尊重
查看>>
badboy录制兼容性有趣测试
查看>>
sqlite字段类型
查看>>
Verilog之VGA
查看>>