洛谷 P4822 [BJWC2012]冻结 题解
P4822 [BJWC2012]冻结
题目描述
“我要成为魔法少女!”
“那么,以灵魂为代价,你希望得到什么?”
“我要将有关魔法和奇迹的一切,封印于卡片之中„„”
在这个愿望被实现以后的世界里,人们享受着魔法卡片(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,也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间 就可以减少到原先的一半。需要注意的是:
- 在一条道路上最多只能使用一张 SpellCard。
- 使用一张SpellCard 只在一条道路上起作用。
- 你不必使用完所有的 SpellCard。
给定以上的信息,你的任务是:求出在可以使用这不超过 K 张时间减速的 SpellCard 之情形下,从城市1 到城市N最少需要多长时间。
输入格式
第一行包含三个整数:N、M、K。
接下来 M 行,每行包含三个整数:Ai、Bi、Timei,表示存在一条 Ai与 Bi之间的双向道路,在不使用 SpellCard 之前提下,通过它需要 Timei的时间。
输出格式
输出一个整数,表示从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≤ Ai,Bi ≤ N,2 ≤ Timei ≤ 2000。
为保证答案为整数,保证所有的 Timei均为偶数。
所有数据中的无向图保证无自环、重边,且是连通的。
【思路】
分层图 + dijkstra
分层图板子题
如果想了解分层图请看这里
了解分层图
【题目大意】
从1到n跑
其中可以让k条路的耗时变为原来的一半
求最小耗时
【题目分析】
如果你不是第一次做最短路的话
那看到这k条减半的路
会情不自禁的联想到k条免费的路
从而想到分层图这个简单的东西
本质上K条免费的路和k调皮减半的路处理方式是一个样的
所以可以用分层图做
【核心思路】
将题目给出的图赋值k遍
然后将两个图之间的路径都标为原来距离的一半
因为那条路被使用了魔法
然后就可以裸着跑dijkstra了
比较用0次魔法到用k次魔法到达的终点里面
哪一个消耗的时间最少就是答案了
【注意】
做分层图题目的时候
必须要对空间范围严格把关
要不然很容易出问题
温馨提示:如果不知道开多少,那就能开多大就开多大
【完整代码】
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
using namespace std;
struct point
{
int w,x;
bool operator < (const point & xx)const
{
return xx.w < w;
}
};
const int Max = 100005;
struct node
{
int y,ne,z;
}a[20 * Max];
int sum = 0;int head[Max];
void add(int x,int y,int z)
{
a[++ sum].y = y;
a[sum].ne = head[x];
a[sum].z = z;
head[x] = sum;
}
int d[Max];
bool use[Max];
priority_queue<point>q;
void dj()
{
memset(d,0x3f,sizeof(d));
d[1] = 0;
q.push((point){0,1});
while(!q.empty())
{
point qwq = q.top();
q.pop();
int x = qwq.x,w = qwq.w;
if(use[x] == true)
continue;
else
use[x] = true;
for(register int i = head[x];i != 0;i = a[i].ne)
{
int awa = a[i].y;
if(d[awa] > d[x] + a[i].z)
{
d[awa] = d[x] + a[i].z;
if(use[awa] == false)
q.push((point){d[awa],awa});
}
}
}
}
int main()
{
int n,m,k;
cin >> n >> m >> k;
int x,y,z;
for(register int i = 1;i <= m;++ i)
{
cin >> x >> y >> z;
add(x,y,z);
add(y,x,z);
for(register int j = 1;j <= k;++ j)
{
add(j * n + x,j * n + y,z);
add(j * n + y,j * n + x,z);
add((j - 1) * n + x,j * n + y,z / 2);
add((j - 1) * n + y,j * n + x,z / 2);
}
}
dj();
int M = 0x7fffffff;
for(register int i = 0;i <= k;++ i)
M = min(M,d[i * n + n]);
cout << M << endl;
return 0;
}
我要成为魔法少女QWQ
洛谷 P4822 [BJWC2012]冻结 题解的更多相关文章
- [洛谷P4822][BJWC2012]冻结
题目大意:有一张$n(n\leqslant50)$个点$m(m\leqslant1000)$条边的无向图,可以使得$k$条边使得边权减半,求最短路 题解:分层图最短路 卡点:无 C++ Code: # ...
- 洛谷 P4822 [BJWC2012]冻结
之前没学分层图,所以先咕了一下hiahiahia. 学完分层图了回来水写题解了. 这道题要用分层图来解.分层图就是在我们决策的时候,再建k层图,一共k+1层,层与层之间是有向边(这个很重要的),权值为 ...
- 洛谷P2832 行路难 分析+题解代码【玄学最短路】
洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...
- 【洛谷P3960】列队题解
[洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...
- 洛谷P2312 解方程题解
洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...
- 洛谷P1577 切绳子题解
洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...
- 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)
洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...
- 洛谷 P1220 关路灯 题解
Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...
- 【洛谷P3410】拍照题解(最大权闭合子图总结)
题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...
随机推荐
- EgretWing链接微信开发工具调试问题
EgretWing链接微信开发工具调试问题 EgretWing 编译器支持持三种调试模式,Node.js .Chrome .EgretWing 扩展开发. 开发过程中会遇到工具配置错误. 这就需要在E ...
- java之mybatis之查询及分页
1.mybatis中查询方式有3种 //查询单个值 @Test public void testFindOne()throws IOException{ SqlSession session = My ...
- 2019 新浪 java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.新浪等公司offer,岗位是Java后端开发,因为发展原因最终选择去了新浪,入职一年时间了,也成为了面试官,之 ...
- python小作业
目录 1.简述变量命名规范 2.name = input(">>>") name变量是什么数据类型通过代码检测 3.if条件语句的基本结构? 4.用print打印 ...
- v8--sort 方法 源码 (2) 快速排序法
v8 sort方法部分关于快速排序法的源码: function QuickSort(a, from, to) { // Insertion sort is faster for short array ...
- (摘录笔记)JAVA学习笔记SSH整合搭建项目
1:当然是导jar包啦: struts2: spring: hibernate: 至于这些jar包是什么作用,我想就不必我解释了,大家都懂得,ssh2基本的jar包: 还有一些其他jar包:strut ...
- elasticsearchTemplate操作es
ElasticsearchTemplate是spring对java api的封装 maven依赖: <dependency> <groupId>org.springframew ...
- django数据表生成
在创建的app中models.py生成表结构 class 表名(models.Model): #表名一般首字母大写 中突出信息的大写 列名=models.Charfield(max_lenth=) # ...
- Python的正则表达式re模块
Python的正则表达式(re模块) 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Python使用re模块提供了正则表达式处理的能力.如果对正则表达式忘记的一干二净的话,可以花费 ...
- Justice(HDU6557+2018年吉林站+二进制)
题目链接 传送门 题意 给你\(n\)个数,每个数表示\(\frac{1}{2^{a_i}}\),要你把这\(n\)个数分为两堆,使得每堆的和都大于等于\(\frac{1}{2}\). 思路 首先我们 ...