在Papa所在的魔法大陆上,有N个城市,M条双向的道路。大魔法师Papa准备开始休假了,在1号城市的他,准备去第N号城市旅行,他想尽快的到达N市,这样他就可以花更多是时间去和老朋友们见面。

Papa有一双魔法靴子,他的魔法靴子可以施法K次,每次施法可以使他的速度快一倍。这也就是说,在通过某条路径时,我们可以选择施一次法,这样,我们通过这一条道路的时间就可以减少到原先的一半。需要注意的是: 
  1. 在一条道路上最多只能施法一次。 
  2. 每次施法只在一条道路上起作用。 
  3. 没有必要把K次施法都用完。

给定以上的信息,你的任务是:求出在可以使用这不超过 K 次的魔法靴子之情形下,从城市1 到城市N最少需要多长时间。

Input
第一行包含三个整数:N、M、K。 
接下来 M 行,每行包含三个整数:Ai、Bi、Ti,表示存在一条 Ai与 Bi之
间的双向道路,在不施法的前提下,通过它需要 Ti的时间。

Output

输出一个整数,表示从1 号城市到 N号城市的最小用时。

Sample Input

4 4 1

1 2 4

4 2 6

1 3 8

3 4 8

Sample Output

7

【样例1 解释】

在不施法时,最短路为 1->2->4,总时间为 10。现在我们可以施法一次,那么我们将通过 2->4 这条道路的时间减半,此时总时间为7。

HINT

对于100%的数据:1  ≤  K  ≤  N ≤  50,M  ≤  1000。 
  1≤  Ai,Bi ≤  N,2 ≤  Timei  ≤  2000。 
为保证答案为整数,保证所有的 Timei均为偶数。 
所有数据中的无向图保证无自环、重边,且是连通的。


定义两个结构体:

struct Edge{  //存边,不解释

  int from,to,val,next;  

}edge[MX];

struct Sta{  //状态,到某位置时的花费

  int arr,cos;

};

我们用一个二维数组 dis[i][j] 表示到 i 位置花费 j 个代价,同时以状态建队:queue<Sta> q;

SPFA:(分两种情况)

1.不施法  

用了 j 次法力到达 i  -> 更新 -> 入队

2.施法

判断 j < t(是否还可以施法)-> 更新 -> 入队

代码如下

#include<stdio.h>
#include<string.h>
#include<algorithm>
#include<queue>
using namespace std;
int n,m,k,dis[101][101],first[101];
bool vis[101][101];struct Edge{int to,val,next;
}edge[2002];
struct Sta{int pos,cos;
};int cnt;
void add(int from,int to,int val)
{edge[++cnt].to=to;edge[cnt].val=val;edge[cnt].next=first[from];first[from]=cnt;
}void Spfa()
{queue<Sta> q;memset(dis,0x3f,sizeof(dis));dis[1][0]=0;vis[1][0]=1;    q.push((Sta){1,0});while(!q.empty()){Sta cur=q.front();q.pop();int pos=cur.pos;int cost=cur.cos;for(int i=first[pos];i;i=edge[i].next){int to=edge[i].to;if(dis[pos][cost]+edge[i].val<dis[to][cost]){dis[to][cost]=dis[pos][cost]+edge[i].val;if(!vis[to][cost]){vis[to][cost]=1;q.push((Sta){to,cost});}}}if(cost<k) {for(int i=first[pos];i;i=edge[i].next){int to=edge[i].to;if(dis[pos][cost]+(edge[i].val>>1) < dis[to][cost+1]){dis[to][cost+1]=dis[pos][cost]+(edge[i].val/2);if(!vis[to][cost+1]){vis[to][cost+1]=1;q.push((Sta){to,cost+1});}}    }}}int ans=0x3f3f3f3f;for(int i=0;i<=k;++i) ans=min(ans,dis[n][i]);printf("%d",ans);
}int main()
{scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=m;++i){int from,to,val;scanf("%d%d%d",&from,&to,&val);add(from,to,val);add(to,from,val);}Spfa();return 0;
}

转载于:https://www.cnblogs.com/qseer/p/9389561.html

Papa的魔法靴子 (原BZOJ 2662)相关推荐

  1. BZOJ 2662: [BeiJing wc2012]冻结(最短路)

    这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...

  2. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MB Submit: 647  Solved: 348 [Submit][S ...

  3. 【bzoj 2662】冻结(还是分层图+spfa)

    http://www.lydsy.com/JudgeOnline/problem.php?id=2662 Description -- 例如,我们熟知的Cirno,她的冰冻魔法当然会有对应的 Spel ...

  4. 魔法币 java_网易2018校招笔试编程题-魔法币 java实现

    魔法币 原题 小易准备去魔法王国采购魔法神器,购买魔法神器需要使用魔法币,但是小易现在一枚魔法币都没有,但是小易有两台魔法机器可以通过投入x(x可以为0)个魔法币产生更多的魔法币. 魔法机器1:如果投 ...

  5. 退役感言 [Away From OI]

    w 终究还是退役了呢. 从初一开始接触到 OI,初三上学期正式开始学习,到现在也过去一年了.2020-10-24 在 ac 的帮助下注册了洛谷账号,11-09 正式到 ZL 开始了短暂的 OI 生涯. ...

  6. Atomic原子类和Unsafe魔法类 详解

    文章目录 1. Atomic原子类 1.1 Atomic原子类的作用 1.2 原子更新基本类型类 1.3 原子更新数组类 1.4 原子更新引用类型 1.5 原子更新字段类 2. Unsafe魔法类 2 ...

  7. ff6全部青魔法获得(不走兽之原)

    以sfc日版为例: [size=x-large]学习条件[/size]:史特高斯在队伍中,且当青魔法使出时没有处于不利状态,青魔法对敌人或我方使用无关紧要.战斗必须胜利.胜利时史特高斯处于何种状态无关 ...

  8. BZOJ 3669: [Noi2014]魔法森林( LCT )

    排序搞掉一维, 然后就用LCT维护加边MST. O(NlogN) ------------------------------------------------------------------- ...

  9. bzoj 1975: [Sdoi2010]魔法猪学院 [k短路]

    1975: [Sdoi2010]魔法猪学院 裸题... 被double坑死了 #include <iostream> #include <cstdio> #include &l ...

最新文章

  1. 【AndroidSupport】LinearLayoutCompat
  2. 成为数据专家,你只差一个Quick Insights的距离
  3. hexo在git上搭建个人博客
  4. AdapterView及其子类之一:基本原理(ListView、ListActivity类型)
  5. net start mysql报发生系统错误2 -- 找不到文件路径
  6. 光华科技光刻胶_【收藏】6天5板!21只光刻胶概念(名单)“出炉”!
  7. 右键添加git-bash
  8. (七)nodejs循序渐进-模块系统(进阶篇)
  9. codeforces 贪心+优先队列_算法基础04-深度优先搜索、广度优先搜索、二分查找、贪心算法...
  10. VueX扒文档的整理
  11. 苦口之药的拼音及解释
  12. Spring 下注解说明
  13. 浮动介绍和定位注意点
  14. 用python写的,一个中英文转摩斯电码小程序
  15. 腾讯翻译君API使用笔记
  16. mina框架CumulativeProtocolDecoder.doDecode方法浅析
  17. Hexo全局添加APlayer音乐播放器
  18. 图片去除下间隙(图片3像素)的方法
  19. 实例:用C#.NET手把手教你做微信公众号开发(8)--普通消息处理之链接(普通消息终结篇)
  20. @Transaction

热门文章

  1. Python 网络爬虫开发 框架 Python游戏编程
  2. win10系统下安装informix 12版本安装和简单使用注意
  3. Aras入门教程2_ItemType详解
  4. [Linux系列]Chrony时间同步服务器
  5. 响应式精美列表商城卡密自动发卡网站源码
  6. 安装flash后仍然提示“您的计算机尚未安装Flash”
  7. QCC300x笔记(4) -- 蓝牙地址的规则
  8. 使用ENVI读取Earth Engine下载的图像波段名的方法
  9. python爬取网易云音乐评论分析_python爬取网易云音乐评论
  10. 2020Java初级面试题一Java基础