题目描述

“我要成为魔法少女!”

“那么,以灵魂为代价,你希望得到什么?”

“我要将有关魔法和奇迹的一切,封印于卡片之中„„”

在这个愿望被实现以后的世界里,人们享受着魔法卡片(\(SpellCard\),又名符卡)带来的便捷。

现在,不需要立下契约也可以使用魔法了!你还不来试一试?

比如,我们在魔法百科全书(\(Encyclopedia of Spells\))里用“\(freeze\)”作为关键字来查询,会有很多有趣的结果。

例如,我们熟知的\(Cirno\),她的冰冻魔法当然会有对应的 \(SpellCard\) 了。 当然,更加令人惊讶的是,居然有冻结时间的魔法,\(Cirno\) 的冻青蛙比起这些来真是小巫见大巫了。

这说明之前的世界中有很多魔法少女曾许下控制时间的愿望,比如 \(Akemi Homura\)、\(Sakuya Izayoi\)、„„

当然,在本题中我们并不是要来研究历史的,而是研究魔法的应用。

我们考虑最简单的旅行问题吧: 现在这个大陆上有 \(N\) 个城市,\(M\) 条双向的道路。城市编号为 \(1~N\),我们在 \(1\) 号城市,需要到 \(N\) 号城市,怎样才能最快地到达呢?

这不就是最短路问题吗?我们都知道可以用 \(Dijkstra、Bellman-Ford、Floyd-Warshall\)等算法来解决。

现在,我们一共有 K 张可以使时间变慢 \(50\%\)的 \(SpellCard\),也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间 就可以减少到原先的一半。需要注意的是:

  1. 在一条道路上最多只能使用一张 \(SpellCard\)。

  2. 使用一张\(SpellCard\) 只在一条道路上起作用。

  3. 你不必使用完所有的 \(SpellCard\)。

    给定以上的信息,你的任务是:求出在可以使用这不超过 \(K\) 张时间减速的 \(SpellCard\) 之情形下,从城市\(1\) 到城市\(N\)最少需要多长时间。

输入输出格式

输入格式:

第一行包含三个整数:\(N、M、K\)。

接下来 \(M\) 行,每行包含三个整数:\(A_i、B_i、Time_i\),表示存在一条 \(A_i\)与 \(B_i\)之间的双向道路,在不使用 \(SpellCard\) 之前提下,通过它需要 \(Time_i\)的时间。

输出格式:

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

输入输出样例

输入样例#1:

4 4 1
1 2 4
4 2 6
1 3 8
3 4 8

输出样例#1:

7

说明

样例解释:

在不使用 \(SpellCard\) 时,最短路为 \(1à2à4\),总时间为 \(10\)。现在我们可以使用 \(1\) 次 \(SpellCard\),那么我们将通过 \(2à4\) 这条道路的时间减半,此时总时间为\(7\)。

对于\(100\%\)的数据:\(1 ≤ K ≤ N ≤ 50,M ≤ 1000\)。

\(1≤ A_i,B_i ≤ N,2 ≤ Time_i ≤ 2000\)。

为保证答案为整数,保证所有的 \(Time_i\)均为偶数。

所有数据中的无向图保证无自环、重边,且是连通的。

思路:还是跟其他的分层最短路题目一样,只不过之前的\(k\)次免费的机会变成了\(k\)次免费缩小到一半的机会,那么分层的时候我们把边权由\(0\)改为\(w/2\)就可以了。

代码:

#include<cstdio>
#include<cstring>
#include<queue>
#include<algorithm>
#include<cctype>
#define maxn 5000001
using namespace std;
int n,m,k,head[maxn],num,dis[maxn],s,t;
inline int qread() {
char c=getchar();int num=0,f=1;
for(;!isdigit(c);c=getchar()) if(c=='-') f=-1;
for(;isdigit(c);c=getchar()) num=num*10+c-'0';return num*f;
}
struct Edge {
int v,w,nxt;
}e[maxn];
struct node {
int x,y;
bool operator < (const node &a) const {return y>a.y;}
};
inline void ct(int u, int v, int w) {
e[++num].v=v;
e[num].w=w;
e[num].nxt=head[u];
head[u]=num;
}
priority_queue<node>q;
inline void dijkstra() {
memset(dis,0x3f,sizeof(dis));
dis[1+n*k]=0;q.push((node){1+n*k,0});
while(!q.empty()) {
int u=q.top().x,d=q.top().y;
q.pop();
if(d!=dis[u]) continue;
for(int i=head[u];i;i=e[i].nxt) {
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w) {
dis[v]=dis[u]+e[i].w;
q.push((node){v,dis[v]});
}
}
}
}
int main() {
n=qread(),m=qread(),k=qread();
for(int i=1,u,v,w;i<=m;++i) {
u=qread(),v=qread(),w=qread();
for(int j=0;j<=k;++j) {
ct(u+j*n,v+j*n,w);
ct(v+j*n,u+j*n,w);
if(j) {
ct(u+j*n,v+(j-1)*n,w/2);
ct(v+j*n,u+(j-1)*n,w/2);
}
}
}
dijkstra();
int zrj=0x7fffffff;
for(int i=0;i<=k;++i) zrj=min(zrj,dis[n+i*n]);
printf("%d\n",zrj);
return 0;
}

洛谷P4822 冻结的更多相关文章

  1. 洛谷 P4822 [BJWC2012]冻结 题解

    P4822 [BJWC2012]冻结 题目描述 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于 ...

  2. [洛谷P4822][BJWC2012]冻结

    题目大意:有一张$n(n\leqslant50)$个点$m(m\leqslant1000)$条边的无向图,可以使得$k$条边使得边权减半,求最短路 题解:分层图最短路 卡点:无 C++ Code: # ...

  3. 洛谷 P4822 [BJWC2012]冻结

    之前没学分层图,所以先咕了一下hiahiahia. 学完分层图了回来水写题解了. 这道题要用分层图来解.分层图就是在我们决策的时候,再建k层图,一共k+1层,层与层之间是有向边(这个很重要的),权值为 ...

  4. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  5. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  6. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

  7. 洛谷 P2701 [USACO5.3]巨大的牛棚Big Barn Label:二维数组前缀和 你够了 这次我用DP

    题目背景 (USACO 5.3.4) 题目描述 农夫约翰想要在他的正方形农场上建造一座正方形大牛棚.他讨厌在他的农场中砍树,想找一个能够让他在空旷无树的地方修建牛棚的地方.我们假定,他的农场划分成 N ...

  8. 洛谷P1710 地铁涨价

    P1710 地铁涨价 51通过 339提交 题目提供者洛谷OnlineJudge 标签O2优化云端评测2 难度提高+/省选- 提交  讨论  题解 最新讨论 求教:为什么只有40分 数组大小一定要开够 ...

  9. 洛谷P1371 NOI元丹

    P1371 NOI元丹 71通过 394提交 题目提供者洛谷OnlineJudge 标签云端评测 难度普及/提高- 提交  讨论  题解 最新讨论 我觉得不需要讨论O long long 不够 没有取 ...

随机推荐

  1. Contiki进程间的交互

    之前都是从各个模块开始看起,从底层开始看起.应该改变一下思路,从高往下看,站得高看得远. 一.Main函数 源码:contiki-release-2-7\platform\stm32test\cont ...

  2. zabbix api支持的数据类型

    bool flag integer float string timestamp array object query countOutput editable excludeSearch filte ...

  3. listen and translation exercise 53

    It was hard work and there weren't any interesting things for him. You should be an expert with comp ...

  4. 瞎写的树dfs序

    这里枚举了树的DFS序来解决树上问题的多个板子,自己最好多看看. ↓改↓ ↓求↓ 点 点 ————————>>>这个就算了 点 树 简单, BIT 点 链 重点! 树 树 简单, 线 ...

  5. 【Lintcode】113.Remove Duplicates from Sorted List II

    题目: Given a sorted linked list, delete all nodes that have duplicate numbers, leaving only distinct  ...

  6. 【LeetCode】063. Unique Paths II

    题目: Follow up for "Unique Paths": Now consider if some obstacles are added to the grids. H ...

  7. Python基础入门知识

    本节内容 Python介绍 发展史 Python 2 or 3? 安装 Hello World程序 变量 用户输入 模块初识 .pyc是个什么鬼? 数据类型初识 数据运算 表达式if ...else语 ...

  8. [转]提高 web 应用性能之 CSS 性能调优

    简介 Web 开发中经常会遇到性能的问题,尤其是 Web 2.0 的应用.CSS 代码是控制页面显示样式与效果的最直接“工具”,但是在性能调优时他们通常被 Web 开发工程师所忽略,而事实上不规范的 ...

  9. P1417烹调方案——背包问题中的排序

    题目:https://www.luogu.org/problemnew/show/P1417 与普通的01背包不同的一点是加入物品的顺序对结果有影响,这里可以考虑贪心的想法,把对全局影响最小的物品排在 ...

  10. vijos:P1155集合位置(次短路)

    描述 每次有大的活动,大家都要在一起“聚一聚”,不管是去好乐迪,还是避风塘,或者汤姆熊,大家都要玩的痛快.还记得心语和花儿在跳舞机上的激情与释放,还记得草草的投篮技艺是如此的高超,还记得狗狗的枪法永远 ...