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,也就是说,在通过某条路径时,我们可以选择使用一张卡片,这样,我们通过这一条道路的时间 就可以减少到原先的一半。需要注意的是:

  1. 在一条道路上最多只能使用一张 SpellCard。
  2. 使用一张SpellCard 只在一条道路上起作用。
  3. 你不必使用完所有的 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]冻结 题解的更多相关文章

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

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

  2. 洛谷 P4822 [BJWC2012]冻结

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

  3. 洛谷P2832 行路难 分析+题解代码【玄学最短路】

    洛谷P2832 行路难 分析+题解代码[玄学最短路] 题目背景: 小X来到了山区,领略山林之乐.在他乐以忘忧之时,他突然发现,开学迫在眉睫 题目描述: 山区有n座山.山之间有m条羊肠小道,每条连接两座 ...

  4. 【洛谷P3960】列队题解

    [洛谷P3960]列队题解 题目链接 题意: Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵. Sylvia 所在的方阵中有 n×m ...

  5. 洛谷P2312 解方程题解

    洛谷P2312 解方程题解 题目描述 已知多项式方程: \[a_0+a_1x+a_2x^2+\cdots+a_nx^n=0\] 求这个方程在 \([1,m]\) 内的整数解(\(n\) 和 \(m\) ...

  6. 洛谷P1577 切绳子题解

    洛谷P1577 切绳子题解 题目描述 有N条绳子,它们的长度分别为Li.如果从它们中切割出K条长度相同的 绳子,这K条绳子每条最长能有多长?答案保留到小数点后2位(直接舍掉2为后的小数). 输入输出格 ...

  7. 洛谷P2507 [SCOI2008]配对 题解(dp+贪心)

    洛谷P2507 [SCOI2008]配对 题解(dp+贪心) 标签:题解 阅读体验:https://zybuluo.com/Junlier/note/1299251 链接题目地址:洛谷P2507 [S ...

  8. 洛谷 P1220 关路灯 题解

    Description 有 $n$ 盏路灯,每盏路灯有坐标(单位 $m$)和功率(单位 $J$).从第 $c$ 盏路灯开始,可以向左或向右关闭路灯.速度是 $1m/s$.求所有路灯的最少耗电.输入保证 ...

  9. 【洛谷P3410】拍照题解(最大权闭合子图总结)

    题目描述 小B有n个下属,现小B要带着一些下属让别人拍照. 有m个人,每个人都愿意付给小B一定钱让n个人中的一些人进行合影.如果这一些人没带齐那么就不能拍照,小B也不会得到钱. 注意:带下属不是白带的 ...

随机推荐

  1. 自己用JQueryUI封装了几个系统常用对话框

    /* * @功能描述:各种系统消息框 * @前置插件:JQueryUI * @开 发 者:魏巍 * @开发日期:2015-04-15 * @version 1.0 */ var SF = {}; SF ...

  2. 类中__iter__与__next__的说明

    class Fab(object): def __init__(self ,max ): self.max =max self.n =0 self.a=0 self.b =1 def __iter__ ...

  3. Spring Boot后端与Angular前端进行timestamp的交互

    后端使用java.sql.Timestamp 后端vo字段类型使用 import java.sql.Timestamp; Mapper可以为字段加上属性jdbcType="TIMESTAMP ...

  4. springCloud学习3(Netflix Hystrix弹性客户端)

    springcloud 总集:https://www.tapme.top/blog/detail/2019-02-28-11-33 本次用到全部代码见文章最下方. 一.为什么要有客户端弹性模式   所 ...

  5. python学习之os模块

    1 window下的路径分隔符和mac上的一样吗 在win下用\做路径分隔符,mac里用/ 2.如何查看当前工作目录 import os os.getcwd() 3.如何切换当前工作目录 import ...

  6. 如何创建SAP Cloud Platform Process Integration runtime服务

    登录SAP Cloud Platform cockpit,进入subaccount的Service marketplace界面,选择process integration runtime: 点击ins ...

  7. Java开发环境之Maven

    查看更多Java开发环境配置,请点击<Java开发环境配置大全> 肆章:Maven安装教程 1)下载Maven安装包 https://maven.apache.org/download.c ...

  8. 教你如何配置linux用户实现禁止ssh登陆机器但可用sftp登录!

    构想和目标最近有个这样的诉求:基于对线上服务器的保密和安全,不希望开发人员直接登录线上服务器,因为登录服务器的权限太多难以管控,如直接修改代码.系统配置,并且也直接连上mysql.因此希望能限制开发人 ...

  9. 爬虫之scrapy框架应用selenium

    一.利用selenium 爬取 网易军事新闻 使用流程: ''' 在scrapy中使用selenium的编码流程: 1.在spider的构造方法中创建一个浏览器对象(作为当前spider的一个属性) ...

  10. JanusGraph多图配置 (cassandra)

    JanusGraph多图配置目的 :一个端口开启后可根据句柄操作多个图 .(cassandra存储后端) 1.GremlinServer多图配置 服务器gremlin-server.yaml中可以设置 ...