题目链接

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;
}

转载于:https://www.cnblogs.com/Kv-Stalin/p/9493512.html

P1875 佳佳的魔法药水 (最短路,DP)相关推荐

  1. 洛谷 P1875 佳佳的魔法药水(最短路) 题解

    题目来源: https://www.luogu.org/problemnew/show/P1875 题目描述: 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样 ...

  2. 洛谷—— P1875 佳佳的魔法药水

    P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 --怎么样才能 ...

  3. P1875 佳佳的魔法药水

    P1875 佳佳的魔法药水 题目描述 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的病只有一种办法,那就是传说中的 0 号药水 --怎么样才能 ...

  4. 洛谷P1875 佳佳的魔法药水

    P1875 佳佳的魔法药水 链接:https://www.luogu.org/problemnew/show/P1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳 ...

  5. Vijos - 佳佳的魔法药水(最短路)

    题目链接:https://vijos.org/p/1285 背景 发完了k张照片,佳佳却得到了一个坏消息:他的MM得病了!佳佳和大家一样焦急万分!治好MM的病只有一种办法,那就是传说中的0号药水--怎 ...

  6. 「Vijos 1285」「OIBH杯NOIP2006第二次模拟赛」佳佳的魔法药水

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

  7. [NDK 佳佳的魔法药水]

    [题目]:佳佳的魔法药水 [来源]:NDK [关键字]:图论 构图 //================================================================ ...

  8. vijos 1282128312841285 佳佳的魔法照片/魔法药水/魔杖/魔法阵

    题目链接: https://vijos.org/p/1282 https://vijos.org/p/1283 https://vijos.org/p/1284 https://vijos.org/p ...

  9. vijosP1285 佳佳的魔法药水

    vijosP1285 佳佳的魔法药水 链接:https://vijos.org/p/1285 [思路] 图论思想. 很巧妙. 如A+B=C,将AB之间连边,边权为C,用以找相连物品与合成物. 用Dij ...

最新文章

  1. 手写一个简单的HashMap,搞定挑剔面试官
  2. VC2019无法打开文件msvcrtd.lib和Spectre 缓解库相关问题
  3. hello1源码解析
  4. php如何获得文件数量,PHP:获取目录中文件数量的最有效方法
  5. Apache Payara:让我们加密
  6. REVERSE-PRACTICE-BUUCTF-15
  7. UI设计干货|可临摹数据可视化页面才王道
  8. Ubuntu16.04LTS +Qt+boost1.66编译错误:consuming_buffers.hpp: parse error in template argument list...
  9. VC运行库合集下载,含VC2005/2008/2010/2012/2013
  10. Mac下超级好用的5个顶级“实用”APP推荐
  11. 5w1h,人机料法环
  12. 怎么批量在文件名前面加上数字序号,对文件进行编号排序?
  13. 个人怎么申请微信公众号
  14. IP地址的认识(一)
  15. 问:女孩学编程好就业吗?
  16. ES-PHP 聚合查询时 No alive nodes found in your cluster
  17. The vulnerabilities were addressed in OpenSSL 1.02f/1.01r. cocos2d 2.2.6
  18. Mac上如何利用itunes恢复存放在移动硬盘的iPhone数据
  19. 计算机中的微信无法启动,无法打开微信计算机版本文件如果无法打开微信计算机版本怎么办...
  20. Linux一键自动安装小栗子桌面 可以用来挂小栗子机器人

热门文章

  1. Office 2007 文件扩展名类型
  2. OpenCV 开闭运算
  3. freebsd php 编译 mysql sql2005_问下:Freebsd下用php连接ms sql server
  4. c语言剪刀石头布课程设计,C++剪刀石头布游戏课程设计方案.doc
  5. tomcat设置自动监听替换class文件
  6. git与eclipse集成之代码冲突与解决
  7. springIOC的那些事
  8. ListView属性设置
  9. Oracle 分析及动态采样
  10. 利用Python3内置文档资源高效学习及官方中文文档