我们用dis[i,j]代表到i这个点,用j张票的最短路程,那么我们只需要在SPFA更新

的时候,用dis[i,j]更新dis[p,j]和dis[p,j+1]就行了

  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. type
  12.     rec                         =record
  13.         x, use                  :longint;
  14.     end;
  15.      
  16. var
  17.     n, m, k                     :longint;
  18.     pre, other, len             :array[..] of longint;
  19.     last                        :array[..] of longint;
  20.     l                           :longint;
  21.     dis                         :array[..,..] of longint;
  22.     flag                        :array[..,..] of boolean;
  23.     que                         :array[..] of rec;
  24.     ans                         :longint;
  25.      
  26. function min(a,b:longint):longint;
  27. begin
  28.     if a>b then min:=b else min:=a;
  29. end;
  30.      
  31. procedure connect(x,y,z:longint);
  32. begin
  33.     inc(l);
  34.     pre[l]:=last[x];
  35.     last[x]:=l;
  36.     other[l]:=y;
  37.     len[l]:=z;
  38. end;
  39.      
  40. procedure init;
  41. var
  42.     i                           :longint;
  43.     x, y, z                     :longint;
  44. begin
  45.     read(n,m,k);
  46.     for i:= to m do
  47.     begin
  48.         read(x,y,z);
  49.         connect(x,y,z);
  50.         connect(y,x,z);
  51.     end;
  52. end;
  53.  
  54. procedure main;
  55. var
  56.     h, t, q, p                  :longint;
  57.     cur, ti                     :longint;
  58.     i                           :longint;
  59.      
  60. begin
  61.     filldword(dis,sizeof(dis) div ,maxlongint div );
  62.     dis[,]:=;
  63.     h:=; t:=;
  64.     que[].x:=; que[].use:=;
  65.     while h<>t do
  66.     begin
  67.         h:=h mod +;
  68.         cur:=que[h].x;
  69.         ti:=que[h].use;
  70.         flag[cur,ti]:=false;
  71.         q:=last[cur];
  72.         while q<> do
  73.         begin
  74.             p:=other[q];
  75.             if dis[cur,ti]+len[q]<dis[p,ti] then
  76.             begin
  77.                 dis[p,ti]:=dis[cur,ti]+len[q];
  78.                 if not flag[p,ti] then
  79.                 begin
  80.                     t:=t mod +;
  81.                     que[t].x:=p; que[t].use:=ti;
  82.                     flag[p,ti]:=true;
  83.                 end;
  84.             end;
  85.             if ti<k then
  86.             begin
  87.                 if dis[cur,ti]+len[q] div <dis[p,ti+] then
  88.                 begin
  89.                     dis[p,ti+]:=dis[cur,ti]+len[q] div ;
  90.                     if not flag[p,ti+] then
  91.                     begin
  92.                         t:=t mod +;
  93.                         que[t].x:=p; que[t].use:=ti+;
  94.                         flag[p,ti+]:=true;
  95.                     end;
  96.                 end;
  97.             end;
  98.             q:=pre[q];
  99.         end;
  100.     end;
  101.     ans:=maxlongint;
  102.     for i:= to k do ans:=min(ans,dis[n,i]);
  103.     writeln(ans);
  104. end;
  105.  
  106. begin
  107.     init;
  108.     main;
  109. end.
  1. /**************************************************************
  2.     Problem:
  3.     User: BLADEVIL
  4.     Language: Pascal
  5.     Result: Accepted
  6.     Time: ms
  7.     Memory: kb
  8. ****************************************************************/
  9.  
  10. //By BLADEVIL
  11. type
  12.     rec                         =record
  13.         x, use                  :longint;
  14.     end;
  15.      
  16. var
  17.     n, m, k                     :longint;
  18.     pre, other, len             :array[..] of longint;
  19.     last                        :array[..] of longint;
  20.     l                           :longint;
  21.     dis                         :array[..,..] of longint;
  22.     flag                        :array[..,..] of boolean;
  23.     que                         :array[..] of rec;
  24.     ans                         :longint;
  25.     st, fin                     :longint;
  26.      
  27. function min(a,b:longint):longint;
  28. begin
  29.     if a>b then min:=b else min:=a;
  30. end;
  31.      
  32. procedure connect(x,y,z:longint);
  33. begin
  34.     inc(l);
  35.     pre[l]:=last[x];
  36.     last[x]:=l;
  37.     other[l]:=y;
  38.     len[l]:=z;
  39. end;
  40.      
  41. procedure init;
  42. var
  43.     i                           :longint;
  44.     x, y, z                     :longint;
  45. begin
  46.     read(n,m,k);
  47.     read(st,fin);
  48.     for i:= to m do
  49.     begin
  50.         read(x,y,z);
  51.         connect(x,y,z);
  52.         connect(y,x,z);
  53.     end;
  54. end;
  55.  
  56. procedure main;
  57. var
  58.     h, t, q, p                  :longint;
  59.     cur, ti                     :longint;
  60.     i                           :longint;
  61.      
  62. begin
  63.     filldword(dis,sizeof(dis) div ,maxlongint div );
  64.     dis[st,]:=;
  65.     h:=; t:=;
  66.     que[].x:=st; que[].use:=;
  67.     while h<>t do
  68.     begin
  69.         h:=h mod +;
  70.         cur:=que[h].x;
  71.         ti:=que[h].use;
  72.         flag[cur,ti]:=false;
  73.         q:=last[cur];
  74.         while q<> do
  75.         begin
  76.             p:=other[q];
  77.             if dis[cur,ti]+len[q]<dis[p,ti] then
  78.             begin
  79.                 dis[p,ti]:=dis[cur,ti]+len[q];
  80.                 if not flag[p,ti] then
  81.                 begin
  82.                     t:=t mod +;
  83.                     que[t].x:=p; que[t].use:=ti;
  84.                     flag[p,ti]:=true;
  85.                 end;
  86.             end;
  87.             if ti<k then
  88.             begin
  89.                 if dis[cur,ti]<dis[p,ti+] then
  90.                 begin
  91.                     dis[p,ti+]:=dis[cur,ti];
  92.                     if not flag[p,ti+] then
  93.                     begin
  94.                         t:=t mod +;
  95.                         que[t].x:=p; que[t].use:=ti+;
  96.                         flag[p,ti+]:=true;
  97.                     end;
  98.                 end;
  99.             end;
  100.             q:=pre[q];
  101.         end;
  102.     end;
  103.     ans:=maxlongint;
  104.     for i:= to k do ans:=min(ans,dis[fin,i]);
  105.     writeln(ans);
  106. end;
  107.  
  108. begin
  109.     init;
  110.     main;
  111. end.

bzoj 2662&bzoj 2763 SPFA变形的更多相关文章

  1. BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划

    BZOJ 4898 [APIO2017] 商旅 | SPFA判负环 分数规划 更清真的题面链接:https://files.cnblogs.com/files/winmt/merchant%28zh_ ...

  2. NOIP2009最优贸易[spfa变形|tarjan 缩点 DP]

    题目描述 C 国有 n 个大城市和 m 条道路,每条道路连接这 n 个城市中的某两个城市.任意两个 城市之间最多只有一条道路直接相连.这 m 条道路中有一部分为单向通行的道路,一部分 为双向通行的道路 ...

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

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

  4. BZOJ 2662: [BeiJing wc2012]冻结(最短路)

    这道题和 BZOJ 2763飞行路线 几乎一模一样..然后飞行路线我是1A,这道题WA了4次,我开始怀疑我的智商了.. ---------------------------------------- ...

  5. bzoj 3875 骑士游戏 - spfa - 动态规划

    Description  [故事背景] 长期的宅男生活中,JYY又挖掘出了一款RPG游戏.在这个游戏中JYY会 扮演一个英勇的骑士,用他手中的长剑去杀死入侵村庄的怪兽. [问题描述] 在这个游戏中,J ...

  6. [BZOJ] 2662: [BeiJing wc2012]冻结

    https://www.lydsy.com/JudgeOnline/problem.php?id=2662 第一次写分层图(捂脸) 一开始真的naive地建图了,T到飞起.. 可以省下建图的空间,直接 ...

  7. Bzoj 2662: [BeiJing wc2012]冻结 dijkstra,堆,分层图,最短路

    2662: [BeiJing wc2012]冻结 Time Limit: 3 Sec  Memory Limit: 128 MBSubmit: 647  Solved: 348[Submit][Sta ...

  8. bzoj 2662 [BeiJing wc2012]冻结——分层图

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2662 这种的都是分层图. #include<iostream> #include ...

  9. BZOJ 1046 上升序列(LIS变形)

    要保证长度为L的序列下标字典序最小,当然要尽量选前面的数. 如何判断前面的数是否满足条件?,只需要知道这个数开头的递增序列的最长长度是多少,如果不小于L,那么必然可以加入这个数.还需判断一下它是否大于 ...

随机推荐

  1. JavaScript序列化对象成URL格式

    http://access911.net/fixhtm/72FABF1E15DCEAF3.htm?tt=

  2. eclipse 列编辑

    ALT + SHIFT +A 进入列编辑模式,可以一次性操作多行列. 再次按住 ALT + SHIFT +A 则退出列编辑模式.

  3. Kotlin的Reified类型:怎样在函数内使用这一类型(KAD 14)

    作者:Antonio Leiva 时间:Mar 2, 2017 原文链接:https://antonioleiva.com/reified-types-kotlin/ 对于Java开发者来说,最懊恼的 ...

  4. LeetCode - 20. Valid Parentheses(0ms)

    Given a string containing just the characters '(', ')', '{', '}', '[' and ']', determine if the inpu ...

  5. 机器视觉必知-GenICam相机通用接口标准

    机器视觉必知-GenICam相机通用接口标准 GenICam(相机通用接口): 一种通用软件接口 通用相机接口标准 目前机器视觉行业所使用的相机几乎均以相同方式来进行配置,即:---通过在注册表中的读 ...

  6. 自定义Json格式

    老铁们都知道,一般的json格式就是键值对格式,在一些特定的框架或者系统中,会用到自定义格式的json文件,假设我们要得到的特定格式json格式如下: {"A":"2&q ...

  7. TCP的挥手协议和握手协议

    三次握手协议:三次握手协议的主要过程是交互彼此之间的初始序列号,如果没有确认的ACK帧可以么?肯定是可以的 client A -------> server B client A 发送了自己的初 ...

  8. 大数据分析中Redis应用

    大数据分析中Redis 大数据时代,海量数据分析就像吃饭一样,成为了我们每天的工作.为了更好的为公司提供运营决策,各种抖机灵甚至异想天开的想法都会紧跟着接踵而来!业务多变,决定了必须每天修改系统,重新 ...

  9. 【bzoj1455】罗马游戏 可并堆+并查集

    题目描述 罗马皇帝很喜欢玩杀人游戏. 他的军队里面有n个人,每个人都是一个独立的团.最近举行了一次平面几何测试,每个人都得到了一个分数. 皇帝很喜欢平面几何,他对那些得分很低的人嗤之以鼻.他决定玩这样 ...

  10. poj 2965 The Pilots Brothers' refrigerator (dfs)

    The Pilots Brothers' refrigerator Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 17450 ...