P1875 佳佳的魔法药水 (最短路,DP)
题目链接
Solution
好题. 一开始一直在想怎么蛇皮建图,但是发现一直蛇不出来...
正解是用类似于 dijkstra 的算法对所有点进行松弛.
对于每个元素记录两个值:
- \(cost\) 代表它的最小花费.
- \(ans\) 代表它的方案数.
- 同时用一个\(f_{i,j}\)记录第\(i\)种和第\(j\)种药水可以合成第\(f_{i,j}\)这种药水.
似乎可以发现我们存合并状态的数组很像临接矩阵?
然后就可以开始蛇了...
我们对于每一瓶药水,其 \(cost\) 初值为其直接买的花费.
\(ans\) 初值为 1.
每一次选择未松弛的价格最小的药水\(u\),然后对于所有的 \(f_{u,i}\) 值进行更新.
\(1.\) 如若 \(cost_{f_{u,i}}>cost_u+cost_i\)
那么 \(cost_{f_{u,i}}=cost_u+cost_i\),同时 \(ans_{f_{u,i}}=ans_u*ans_i\)
\(2.\) 如果 \(cost_{f_{u,i}}=cost_u+cost_i\)
那么 \(ans_{f_{u,i}}=ans_{f_{u,i}}+ans_u*ans_i\)
然后最后的答案即为 \(cost[0]\)以及 \(ans[0]\).
Code
#include<bits/stdc++.h>
using namespace std;
const int inf=192608173;
const int maxn=1008;
int f[maxn][maxn],n;
int cost[maxn],ans[maxn];
void dijkstra()
{
int v[1010]={0},k,minimum;
for(int i=1;i<=n;i++)
{
minimum=inf;
for(int j=0;j<n;j++)
if(!v[j]&&cost[j]<minimum)
{k=j;minimum=cost[j];}
//类似于dij的选边进行松弛.
if(minimum==inf) break;
v[k]=1;
for(int j=0;j<n;j++)
if(v[j]&&f[j][k]>-1)
if(cost[f[j][k]]>cost[j]+cost[k])
{
cost[f[j][k]]=cost[j]+cost[k];
ans[f[j][k]]=ans[j]*ans[k];
continue;
}
else if(cost[f[j][k]]==cost[j]+cost[k])
ans[f[j][k]]+=ans[j]*ans[k];
}
}
int main()
{
scanf("%d",&n);
for(int i=0;i<n;i++)
scanf("%d",&cost[i]);
int a,b,c;
memset(f,-1,sizeof(f));
while(cin>>a>>b>>c)
{f[a][b]=c;f[b][a]=c;}//此处建边.
for(int i=0;i<n;i++)
ans[i]=1;
dijkstra();
cout<<cost[0]<<" "<<ans[0];
return 0;
}
P1875 佳佳的魔法药水 (最短路,DP)的更多相关文章
- 洛谷 P1875 佳佳的魔法药水
P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 --怎么样才能 ...
- P1875 佳佳的魔法药水
P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 ……怎么样才能 ...
- 洛谷—— P1875 佳佳的魔法药水
https://www.luogu.org/problemnew/show/1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的 ...
- 「Vijos 1285」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法药水
佳佳的魔法药水 背景 发完了k张照片,佳佳却得到了一个坏消息:他的MM得病了!佳佳和大家一样焦急万分!治好MM的病只有一种办法,那就是传说中的0号药水--怎么样才能得到0号药水呢?你要知道佳佳的家境也 ...
- vijosP1285 佳佳的魔法药水
vijosP1285 佳佳的魔法药水 链接:https://vijos.org/p/1285 [思路] 图论思想. 很巧妙. 如A+B=C,将AB之间连边,边权为C,用以找相连物品与合成物. 用Dij ...
- vijos:P1285佳佳的魔法药水
背景 发完了k张照片,佳佳却得到了一个坏消息:他的MM得病了!佳佳和大家一样焦急万分!治好MM的病只有一种办法,那就是传说中的0号药水……怎么样才能得到0号药水呢?你要知道佳佳的家境也不是很好,成本得 ...
- 「Vijos 1283」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔杖
佳佳的魔杖 背景 配制成功了珍贵的0号药水,MM的病治好了.轻松下来的佳佳意外的得到了一个好东西--那就是--一种非常珍贵的树枝.这些树枝可以用来做优质的魔杖!当然了,不能只做自己的,至少还要考虑到M ...
- TYVJ P3407 佳佳的魔法照片 Label:语文很重要 语文很重要 语文很重要
描述 佳佳的魔法照片(mphoto.pas\c\cpp) [题目背景] 佳佳的魔法照片(Magic Photo):如果你看过<哈利•波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为 ...
- hdu 4568 Hunter 最短路+dp
Hunter Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Subm ...
随机推荐
- docker安装gitlab-ce
pull and run docker pull docker.io/gitlab/gitlab-ce docker run -itd --name gitlab -p 10080:80 gitlab ...
- Python——print用法详解
1.print语法格式 print()函数具有丰富的功能,详细语法格式如下:print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fa ...
- java开发微信公众号----开发者基本配置的
首先附上微信公众平台开发技术文档地址:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1472017492_58YV5 本文主要描 ...
- JS数据结构与算法--双向链表
双向链表中链接是双向的:一个链向下一个元素,另一个链向上一个元素,如下图所示: 双向链表结构代码如下: class Node { constructor(element) { this.element ...
- VIM 编辑器 -使用详解记录
1.什么是 vim? Vim是从 vi 发展出来的一个文本编辑器.代码补完.编译及错误跳转等方便编程的功能特别丰富,在程序员中被广泛使用.简单的来说, vi 是老式的字处理器,不过功能已经很齐全了,但 ...
- FTP服务-实现vsftpd虚拟用户
前几篇介绍了基础,这篇将具体实现几个案例 实现基于文件验证的vsftpd虚拟用户,每个用户独立一个文件夹 1.创建用户数据库文件 vim /etc/vsftpd/vusers.txt qq cento ...
- 蓝牙stack bluez学习(1)Stack Architecture
Bluez支持的features Core Specification 4.2 (GAP, L2CAP, RFCOMM, SDP, GATT) Classic Bluetooth (BR/EDR) B ...
- Python头脑风暴3
驾校是个暴利行业 如果有高学历靠谱的IT人员做驾校教练等等等等.... Python虽然难做企业级应用,但Python是全球个人自定义应用的首选!!!没有之一,所有语言最快的开发速度,最个性化的私人定 ...
- leetcode-8-pointer
void deleteNode(ListNode* node) { *node = *node->next; }
- linux学习-用户的特殊 shell 与 PAM 模块
特殊的 shell, /sbin/nologin 『无法登入』指的是:『这个使用者无法使用 bash 或其他 shell 来登入系统』而已, 并不是说这个账号就无法使用其他的系统资源! 让某个具有 / ...