题目链接


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)的更多相关文章

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

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

  2. P1875 佳佳的魔法药水

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

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

    https://www.luogu.org/problemnew/show/1875 题目背景 发完了 k 张照片,佳佳却得到了一个坏消息:他的 MM 得病了!佳佳和大家一样焦急 万分!治好 MM 的 ...

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

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

  5. vijosP1285 佳佳的魔法药水

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

  6. vijos:P1285佳佳的魔法药水

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

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

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

  8. TYVJ P3407 佳佳的魔法照片 Label:语文很重要 语文很重要 语文很重要

    描述 佳佳的魔法照片(mphoto.pas\c\cpp) [题目背景] 佳佳的魔法照片(Magic Photo):如果你看过<哈利•波特>,你就会知道魔法世界里的照片是很神奇的.也许是因为 ...

  9. hdu 4568 Hunter 最短路+dp

    Hunter Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Subm ...

随机推荐

  1. FiraCode 字体 => 箭头函数变成 整体 还有 等于 不等于

    https://github.com/tonsky/FiraCode Enable in Settings → Editor → Color Scheme → Color Scheme Font →  ...

  2. python基础一 day15 内置函数

    '\r' 回车,回到当前行的行首,而不会换到下一行,如果接着输出的话,本行以前的内容会被逐一覆盖: '\n' 换行,换到当前位置的下一行,而不会回到行首: # print()# input()# le ...

  3. 2018.3.12 Leecode习题 给定一个整数数列,找出其中和为特定值的那两个数。

    给定一个整数数列,找出其中和为特定值的那两个数. 你可以假设每个输入都只会有一种答案,同样的元素不能被重用. 示例: 给定 nums = [2, 7, 11, 15], target = 9; 因为 ...

  4. Python 多线程应用

    同步锁 import time import threading def subNum(): global num # print("ok") lock.acquire() # 加 ...

  5. [].indexOf.call()学习

    今天看到闭包一道题,就是一个li列表,点击列表控制台输出对应的索引.这里考察了var的作用域问题和闭包对外部变量的引用问题,有几种解决方法. html: <ul> <li>te ...

  6. Android驱动开发读书笔记五

    第五章 本章介绍了S3C6410开发板的功能,开发板的不同主要是在烧录嵌入式系统的方式不同,以及如何在此开发板上安装Android. 1.安装串口调试工具minicom 首先需要一根USB转串口线,由 ...

  7. 机器学习(一)之KNN算法

    knn算法原理 ①.计算机将计算所有的点和该点的距离 ②.选出最近的k个点 ③.比较在选择的几个点中那个类的个数多就将该点分到那个类中 KNN算法的特点: knn算法的优点:精度高,对异常值不敏感,无 ...

  8. 【js】input 焦点到内容的最后

     //引用部分应支持jQuery  function find_focus(obj){    var curr = jQuery(obj);    var val = curr.val();    c ...

  9. centos 7 安装WordPress的参考博文

    安装方法: https://www.cnblogs.com/flankershen/p/7476415.html 安装完,测试不成功的解决办法: https://blog.csdn.net/u0104 ...

  10. MySQL配置允许远程登录

    MySQL默认只允许用户本地登录,需要远程连接可进行如下操作: 允许root用户在任何地方进行远程登录,并具有所有库任何操作权限: 使用root用户登录mysql: mysql -u root -p& ...