Description

“我要成为魔法少女!”   
  “那么,以灵魂为代价,你希望得到什么?” 
“我要将有关魔法和奇迹的一切,封印于卡片之中„„”   
   
  在这个愿望被实现以后的世界里,人们享受着魔法卡片(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最少需要多长时间。

Input

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

Output

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

Sample Input

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

Sample Output


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

HINT

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

1≤  Ai,Bi ≤  N,2 ≤  Timei  ≤  2000。

为保证答案为整数,保证所有的 Timei均为偶数。

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

 

Solution

因为k这么小,所以直接分层图,板子题

不会A*,瑟瑟发抖

#include <bits/stdc++.h>

#define ll long long
#define inf 0x3f3f3f3f
#define il inline namespace io { #define in(a) a=read()
#define out(a) write(a)
#define outn(a) out(a),putchar('\n') #define I_int int
inline I_int read() {
I_int x = , f = ; char c = getchar() ;
while( c < '' || c > '' ) { if( c == '-' ) f = - ; c = getchar() ; }
while( c >= '' && c <= '' ) { x = x * + c - '' ; c = getchar() ; }
return x * f ;
}
char F[ ] ;
inline void write( I_int x ) {
I_int tmp = x > ? x : -x ;
if( x < ) putchar( '-' ) ;
int cnt = ;
while( tmp > ) {
F[ cnt ++ ] = tmp % + '' ;
tmp /= ;
}
while( cnt > ) putchar( F[ -- cnt ] ) ;
}
#undef I_int }
using namespace io ; using namespace std ; #define N 50010
#define inf 0x3f3f3f3f
#define ll long long int n = read() , m = read() , K = read() ;
int d[ N ][ ] , vis[ N ] , q[ N ] ;
int head[ N ] , cnt ;
struct node {
int to , nxt , v ;
} e[ N ] ; void ins( int u , int v , int w ) {
e[ ++ cnt ].to = v ;
e[ cnt ].nxt = head[ u ] ;
e[ cnt ].v = w ;
head[ u ] = cnt ;
} void spfa( int s ) {
int l = , r = ;
for( int i = ; i <= n ; i ++ ) {
for( int j = ; j <= K ; j ++ ) {
d[ i ][ j ] = inf ;
}
}
q[ l ] = s , vis[ s ] = , d[ s ][ ] = ;
while( l != r ) {
int u = q[ l ++ ] ;
if( l == ) l = ;
vis[ u ] = ;
for( int i = head[ u ] ; i ; i =e[ i ].nxt ) {
int v = e[ i ].to , flag = ;
if( d[ v ][ ] > d[ u ][ ] + e[ i ].v ) {
d[ v ][ ] = d[ u ][ ] + e[ i ].v ;
flag = ;
}
for( int k = ; k <= K ; k ++ ) {
if( d[ v ][ k ] > d[ u ][ k - ] + e[ i ].v / ) {
d[ v ][ k ] = d[ u ][ k - ] + e[ i ].v / ;
flag = ;
}
if( d[ v ][ k ] > d[ u ][ k ] + e[ i ].v ) {
d[ v ][ k ] = d[ u ][ k ] + e[ i ].v ;
flag = ;
}
}
if( !vis[ v ] && flag ) {
vis[ v ] = ;
q[ r ++ ] = v ;
if( r == ) r = ;
}
}
}
int ans = inf ;
for( int i = ; i <= K ; i ++ )
ans = min( ans , d[ n ][ i ] ) ;
if( ans == inf ) puts("-1") ;
else printf( "%d\n" , ans ) ;
} int main() {
for( int i = ; i <= m ; i ++ ) {
int a = read() , b = read() , c = read() ;
ins( a , b , c ) , ins( b , a , c ) ;
}
spfa( ) ;
}

BZOJ2662: [BeiJing wc2012]冻结 spfa+分层图的更多相关文章

  1. BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路

    BZOJ_2662_[BeiJing wc2012]冻结_分层图最短路 Description “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切, ...

  2. bzoj 2662: [BeiJing wc2012]冻结【分层图+spfa】

    死活想不到分层图emmm 基本想法是建立分层图,就是建k+1层原图,然后相邻两层之间把原图的边在上一层的起点与下一层的终点连起来,边权为val/2,表示免了这条边的边权,然后答案就是第0层的s到k层的 ...

  3. BZOJ2662[BeiJing wc2012]冻结——分层图最短路

    题目描述 “我要成为魔法少女!”     “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”     在这个愿望被实现以后的世界里,人们享受着魔法卡片(Spe ...

  4. [bzoj2662 BeiJing wc2012] 冻结 (分层图+最短路)

    传送门 Description "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„&q ...

  5. 【最短路】【Heap-Dijkstra】【分层图】bzoj2662 [BeiJing wc2012]冻结

    裸的分层图最短路. #include<cstdio> #include<cstring> #include<queue> #include<algorithm ...

  6. bzoj2662 [BeiJing wc2012]冻结 ——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662 分层图: 我也不知道我写的是不是 bfs (dijkstra?). 代码如下: #in ...

  7. BZOJ2662 [BeiJing wc2012]冻结

    网上的题解都是分层图+spfa或者dijkstra 我觉得dijk太难写了,懒得写,看了一下数据范围$N=50$,这显然是出题人勾引人犯罪 我决定使用floyd的做法,令$f[i][j][t](k)$ ...

  8. BZOJ2662[BeiJing wc2012]冻结【SPFA】

    “我要成为魔法少女!” “那么,以灵魂为代价,你希望得到什么?” “我要将有关魔法和奇迹的一切,封印于卡片之中„„”        在这个愿望被实现以后的世界里,人们享受着魔法卡片(SpellCard ...

  9. bzoj2662: [BeiJing wc2012]冻结 最短路 建图

    好久没有1A题啦♪(^∇^*) 一个sb建图,我居然调样例调了10min 看起来是双向边,其实在建图的时候要当成有向图, 否则他会时间倒流(233) 把每个点裂成k个点,然后把每条边裂成4条边(正向反 ...

随机推荐

  1. oracle查询表结构语句

    select o.table_name, tmp.comments, o.COLUMN_NAME, t.comments, o.DATA_TYPE || CASE TRIM(o.DATA_TYPE) ...

  2. Stringbuffer扩容

    public class A { public static void main(String[] args) { StringBuffer ab=new StringBuffer(); String ...

  3. PHP移动互联网开发笔记(6)——MySQL数据库基础回想

    近期看了一些架构方面的资料.可是发现基础知识都不怎么坚固,接下来的一段时间.我会定期总结基础知识. 一.数据类型   1.整型   数据类型 存储空间 说明 取值范围 TINYINT 1字节 很小的整 ...

  4. ubuntu,windows 卸载安装mysql

    首先删除mysql: sudo apt-get remove mysql-* 1 然后清理残留的数据 dpkg -l |grep ^rc|awk '{print $2}' |sudo xargs dp ...

  5. pycharm进行调试[转载]

    转自:https://blog.csdn.net/william_hehe/article/details/80898031 1.首先设置断点. 2.Step into(F7):进入 若函数A内存在子 ...

  6. AngularJS2.0起步

    ES6工具链 要让Angular2应用跑起来不是件轻松的事,因为它用了太多还不被当前主流浏览器支持的技术.所以,我们需要一个工具链:

  7. MongoDB和pymongo自用手册

    [*] 本文出处:http://b1u3buf4.xyz/ [*] 本文作者:B1u3Buf4 [*] 本文授权:禁止转载 从自己的另一处博客移动过来.长期维护,不定期添加新内容. 前述和安装 mon ...

  8. 复习一下property

    在面向对象程序里,一个对象不要直接访问另一个对象内部的数据.所以我们使用accessor methods来进行对象内部的数据交互. accessor methods(getters and sette ...

  9. UNDFTD x Nike Air Max 97 OG Black

    The UNDFTD x Nike Air Max 97 OG Black is releasing way sooner than anticipated. This collaborative r ...

  10. 让声音更清晰,用PR去掉视频中的噪音

    Premiere V7.0没有支持当前文件类型的输入源的问题 25 我是新手,把DVD影片放到电脑里,显示的是VOB文件,导入类型显示的是所有支持格式,于是我就点击了VOB文件,但是说没有支持当前文件 ...