佳佳的魔法药水

背景

发完了k张照片,佳佳却得到了一个坏消息:他的MM得病了!佳佳和大家一样焦急万分!治好MM的病只有一种办法,那就是传说中的0号药水……怎么样才能得到0号药水呢?你要知道佳佳的家境也不是很好,成本得足够低才行……

描述

得到一种药水有两种方法:可以按照魔法书上的指导自己配置,也可以到魔法商店里去买——那里对于每种药水都有供应,虽然有可能价格很贵。在魔法书上有很多这样的记载:1份A药水混合1份B药水就可以得到1份C药水。(至于为什么1+1=1,因为……这是魔法世界)好了,现在你知道了需要得到某种药水,还知道所有可能涉及到的药水的价格以及魔法书上所有的配置方法,现在要问的就是:1.最少花多少钱可以配制成功这种珍贵的药水;2.共有多少种不同的花费最少的方案(两种可行的配置方案如果有任何一个步骤不同则视为不同的)。假定初始时你手中并没有任何可以用的药水。

输入格式

第一行有一个整数\(N(N \le 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

样例输入1

7
10 5 6 3 2 2 3
1 2 0
4 5 1
3 6 2

样例输出1

10 3

限制

1秒

提示

最优方案有3种,分别是:直接买0号药水;买4号药水、5号药水配制成1号药水,直接买2号药水,然后配制成0号药水;买4号药水、5号药水配制成1号药水,买3号药水、6号药水配制成2,然后配制成0。


思路

这道题,我扪可以使用类似于最短路的方法做。

与最短路类似,我们引入蓝点、白点的概念,即确定一些药品的最佳购买方案,并用它们来优化其他药品的方案。

很明显,目前购买价格(或制取价格)最低的是不可能再优化的,因此把它的价格确定,优化它能优化的所有方案。

然后继续以这种方式确定药水的最小购买(制取)价格,最后得到的就是每个药品的最低价。

由于数据范围较小,这里不必用堆优化,直接暴力就可以了。如果实在要卡你,就使用一个堆优化就好了。

至于方案数,可以再用一个数组记录,与最短路计数差不多,只要注意运用加法原理与乘法原理,这里不再赘述。

还有注意开long long(似乎不开也可以过,保险起见还是开起来吧)。

代码

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1005
#define INF 1000000000000000000
#define LL long long
typedef pair<int, int> pi; struct ppp{
int x, y, z;
}; ppp make( LL x, LL y, LL z ){
ppp t; t.x = x; t.y = y; t.z = z;
return t;
} int N;
int m[MAXN][MAXN];
bool vis[MAXN];
LL dis[MAXN], s[MAXN]; void Dij(){
for ( int i = 0; i < N; ++i ){
int t(-1);
for ( int j = 0; j < N; ++j ) if ( !vis[j] && ( t == -1 || dis[t] > dis[j] ) ) t = j;
if ( t == -1 ) return;
vis[t] = 1;
for ( int j = 0; j < N; ++j )
if ( m[t][j] < N && vis[t] && vis[j] ){
if ( dis[m[t][j]] > dis[t] + dis[j] ){
dis[m[t][j]] = dis[t] + dis[j]; s[m[t][j]] = s[t] * s[j];
}else if ( dis[m[t][j]] == dis[t] + dis[j] ) s[m[t][j]] += s[t] * s[j];
}
}
} int main(){
scanf( "%d", &N );
for ( int i = 0; i < N; ++i ) scanf( "%lld", &dis[i] ), s[i] = 1;
int x, y, z;
memset( m, 0x3f, sizeof m );
while( ~scanf( "%d%d%d", &x, &y, &z ) ) m[x][y] = m[y][x] = z;
Dij();
printf( "%lld %lld\n", dis[0], s[0] );
return 0;
}

「Vijos 1285」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法药水的更多相关文章

  1. 「Vijos 1282」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法照片

    佳佳的魔法照片 背景 佳佳的魔法照片(Magic Photo):如果你看过<哈利·波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为小魔法师佳佳长的太帅,很多人都找他要那种神奇的魔法 ...

  2. 「Vijos 1284」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法阵

    佳佳的魔法阵 背景 也许是为了捕捉猎物(捕捉MM?),也许是因为其它原因,总之,佳佳准备设计一个魔法阵.而设计魔法阵涉及到的最关键问题,似乎就是那些带有魔力的宝石的摆放-- 描述 魔法阵是一个\(n ...

  3. 「Vijos 1283」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔杖

    佳佳的魔杖 背景 配制成功了珍贵的0号药水,MM的病治好了.轻松下来的佳佳意外的得到了一个好东西--那就是--一种非常珍贵的树枝.这些树枝可以用来做优质的魔杖!当然了,不能只做自己的,至少还要考虑到M ...

  4. 「CSP-S模拟赛」2019第四场

    「CSP-S模拟赛」2019第四场 T1 「JOI 2014 Final」JOI 徽章 题目 考场思考(正解) T2 「JOI 2015 Final」分蛋糕 2 题目 考场思考(正解) T3 「CQO ...

  5. #10471. 「2020-10-02 提高模拟赛」灌溉 (water)

    题面:#10471. 「2020-10-02 提高模拟赛」灌溉 (water) 假设只有一组询问,我们可以用二分求解:二分最大距离是多少,然后找到深度最大的结点,并且把它的\(k\)倍祖先的一整子树删 ...

  6. #10470. 「2020-10-02 提高模拟赛」流水线 (line)

    题面:#10470. 「2020-10-02 提高模拟赛」流水线 (line) 题目中的那么多区间的条件让人感觉极其难以维护,而且贪心的做法感觉大多都能 hack 掉,因此考虑寻找一些性质,然后再设计 ...

  7. 「CSP-S模拟赛」2019第三场

    目录 T1 「POI2007」山峰和山谷 Ridges and Valleys 题目 考场思路(几近正解) 正解 T2 「JOI 2013 Final」 现代豪宅 题目 考场思路(正解) T3 「SC ...

  8. 「CSP-S模拟赛」2019第二场

    目录 T1 Jam的计数法 题目 考场思路(正解) T2 「TJOI / HEOI2016」排序 题目 考场思路(假正解) 正解 T3 「THUWC 2017」随机二分图 题目 考场思路 正解 这场考 ...

  9. 「CSP-S模拟赛」2019第一场

    目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) ...

随机推荐

  1. epoll简介(二)

    一:多路复用的举例 以一个生活中的例子来解释: 假设你在大学中读书,要等待一个朋友(数据)来访(要读),而这个朋友只知道你在A号楼(socket集合),但是不知道你具体住在哪里,于是你们约好了在A号楼 ...

  2. 2014年最热门的国人开发开源软件TOP100

    2014年最热门的国人开发开源软件TOP100 不知道从什么时候开始,很多一说起国产好像就非常愤慨,其实大可不必.做开源中国六年有余,这六年时间国内的开源蓬勃发展,从一开始的使用到贡献,到推出自己很多 ...

  3. CSS常用函数calc等

    >>CSS常用函数<<

  4. selenium webdriver学习(二)————对浏览器的简单操作(转载JARVI)

    selenium webdriver学习(二)————对浏览器的简单操作 博客分类: Selenium-webdriver   selenium webdriver对浏览器的简单操作 打开一个测试浏览 ...

  5. ngRoute

    ngRoute 模块中包含以下内容, 名称 所属 作用 ngView DIRECTIVE 提供不同路由模板插入的视图层 $routeProvider PROVIDER 提供路由配置 $route SE ...

  6. Mysql错误:#1054 - Unknown column 'id' in 'field list' 解决办法

    第一次用mysql,在插入数据时,竟然报这样的错误, #1054 - Unknown column 'id' in 'field list'

  7. hdu 4394 Digital Square(bfs)

    Digital Square Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)To ...

  8. ubuntu snmp 安装与配置

    0.说明 关于一个完整的教程,还是那句话,国内的要么不完整,要么就太旧了,而且思路也不清晰,所以这里写一篇完整的给大家分享一下. 虽然对于Linux主机的监控可以通过执行特定的命令来完成,但是相比之后 ...

  9. visualStudio 无法登陆

    如果遇到 visualStudio 无法登陆,可以看下我的方法,可能有用 尝试关闭代理 打开设置.网络.代理,关了它,试试 如果遇到下面的问题: 我们无法刷新此账户的凭据 No home tenant ...

  10. git如何移除某文件的版本控制

    1:还没有加到版本控制中 (1)还没有git  add 在   .gitignore中添加 (2)已经git add 先   git  rm  -r  --cached   文件 在   .gitig ...