码迷,mamicode.com
首页 > 其他好文 > 详细

bzoj2662:[BeiJing wc2012]冻结

时间:2017-09-09 00:50:29      阅读:180      评论:0      收藏:0      [点我收藏+]

标签:sizeof   lca   mic   输出   有趣   bellman   最小   rsh   amp   

题目描述

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

 

样例输入

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

样例输出

7
【样例1 解释】
在不使用 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均为偶数。 

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

题解

裸的分层图最短路

 

 1 #include<cstdio>
 2 #include<algorithm>
 3 #include<cstring>
 4 #include<queue>
 5 #define maxn 55
 6 #define maxm 1005
 7 #define inf 1<<29
 8 using namespace std;
 9 int head[maxn],d[maxn][maxn];
10 bool vis[maxn][maxn];
11 int ecnt,n,m,k,ans=inf;
12 struct edge{
13     int u,v,w,next;
14 }E[maxm<<1];
15 struct node{
16     int num,knum;
17     node(int x,int y):num(x),knum(y){}
18 };
19 void addedge(int u,int v,int w)
20 {
21     E[++ecnt].u=u;
22     E[ecnt].v=v;
23     E[ecnt].w=w;
24     E[ecnt].next=head[u];
25     head[u]=ecnt;
26 }
27 void spfa()
28 {
29     queue<node> q;
30     memset(d,127/3,sizeof(d));
31     d[1][0]=0;vis[1][0]=1;
32     node now(1,0);
33     q.push(now);
34     while(!q.empty())
35     {
36         node now=q.front();q.pop();
37         int dd=now.num;
38         int kk=now.knum;
39         vis[dd][kk]=0;
40         for(int i=head[dd] ; i ; i=E[i].next )
41         {
42             int v=E[i].v;
43             int w=E[i].w;
44             if(d[v][kk]>d[dd][kk]+w)
45             {
46                 d[v][kk]=d[dd][kk]+w;
47                 if(!vis[v][kk])
48                 {
49                     vis[v][kk]=1;
50                     q.push(node(v,kk));
51                 }
52             }
53             if(d[v][kk+1]>d[dd][kk]+(w>>1)&&kk<k)
54             {
55                 d[v][kk+1]=d[dd][kk]+(w>>1);
56                 if(!vis[v][kk+1])
57                 {
58                     vis[v][kk+1]=1;
59                     q.push(node(v,kk+1));
60                 }
61             }
62         }
63     }
64     for(int i=1 ; i<=k ; ++i)ans=min(ans,d[n][i]);
65     printf("%d",ans);
66 }
67 int main()
68 {
69     int u,v,w;
70     scanf("%d%d%d",&n,&m,&k);
71     for(int i=1 ; i<=m ; ++i )
72     {
73         scanf("%d%d%d",&u,&v,&w);
74         addedge(u,v,w);
75         addedge(v,u,w);
76     }
77     spfa();
78     return 0;
79 } 

 

 

 

bzoj2662:[BeiJing wc2012]冻结

标签:sizeof   lca   mic   输出   有趣   bellman   最小   rsh   amp   

原文地址:http://www.cnblogs.com/fujudge/p/7496822.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!