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

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

/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
type
    rec                         =record
        x, use                  :longint;
    end;
     
var
    n, m, k                     :longint;
    pre, other, len             :array[..] of longint;
    last                        :array[..] of longint;
    l                           :longint;
    dis                         :array[..,..] of longint;
    flag                        :array[..,..] of boolean;
    que                         :array[..] of rec;
    ans                         :longint;
     
function min(a,b:longint):longint;
begin
    if a>b then min:=b else min:=a;
end;
     
procedure connect(x,y,z:longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
    len[l]:=z;
end;
     
procedure init;
var
    i                           :longint;
    x, y, z                     :longint;
begin
    read(n,m,k);
    for i:= to m do
    begin
        read(x,y,z);
        connect(x,y,z);
        connect(y,x,z);
    end;
end;
 
procedure main;
var
    h, t, q, p                  :longint;
    cur, ti                     :longint;
    i                           :longint;
     
begin
    filldword(dis,sizeof(dis) div ,maxlongint div );
    dis[,]:=;
    h:=; t:=;
    que[].x:=; que[].use:=;
    while h<>t do
    begin
        h:=h mod +;
        cur:=que[h].x;
        ti:=que[h].use;
        flag[cur,ti]:=false;
        q:=last[cur];
        while q<> do
        begin
            p:=other[q];
            if dis[cur,ti]+len[q]<dis[p,ti] then
            begin
                dis[p,ti]:=dis[cur,ti]+len[q];
                if not flag[p,ti] then
                begin
                    t:=t mod +;
                    que[t].x:=p; que[t].use:=ti;
                    flag[p,ti]:=true;
                end;
            end;
            if ti<k then
            begin
                if dis[cur,ti]+len[q] div <dis[p,ti+] then
                begin
                    dis[p,ti+]:=dis[cur,ti]+len[q] div ;
                    if not flag[p,ti+] then
                    begin
                        t:=t mod +;
                        que[t].x:=p; que[t].use:=ti+;
                        flag[p,ti+]:=true;
                    end;
                end;
            end;
            q:=pre[q];
        end;
    end;
    ans:=maxlongint;
    for i:= to k do ans:=min(ans,dis[n,i]);
    writeln(ans);
end;
 
begin
    init;
    main;
end.
/**************************************************************
    Problem:
    User: BLADEVIL
    Language: Pascal
    Result: Accepted
    Time: ms
    Memory: kb
****************************************************************/
 
//By BLADEVIL
type
    rec                         =record
        x, use                  :longint;
    end;
     
var
    n, m, k                     :longint;
    pre, other, len             :array[..] of longint;
    last                        :array[..] of longint;
    l                           :longint;
    dis                         :array[..,..] of longint;
    flag                        :array[..,..] of boolean;
    que                         :array[..] of rec;
    ans                         :longint;
    st, fin                     :longint;
     
function min(a,b:longint):longint;
begin
    if a>b then min:=b else min:=a;
end;
     
procedure connect(x,y,z:longint);
begin
    inc(l);
    pre[l]:=last[x];
    last[x]:=l;
    other[l]:=y;
    len[l]:=z;
end;
     
procedure init;
var
    i                           :longint;
    x, y, z                     :longint;
begin
    read(n,m,k);
    read(st,fin);
    for i:= to m do
    begin
        read(x,y,z);
        connect(x,y,z);
        connect(y,x,z);
    end;
end;
 
procedure main;
var
    h, t, q, p                  :longint;
    cur, ti                     :longint;
    i                           :longint;
     
begin
    filldword(dis,sizeof(dis) div ,maxlongint div );
    dis[st,]:=;
    h:=; t:=;
    que[].x:=st; que[].use:=;
    while h<>t do
    begin
        h:=h mod +;
        cur:=que[h].x;
        ti:=que[h].use;
        flag[cur,ti]:=false;
        q:=last[cur];
        while q<> do
        begin
            p:=other[q];
            if dis[cur,ti]+len[q]<dis[p,ti] then
            begin
                dis[p,ti]:=dis[cur,ti]+len[q];
                if not flag[p,ti] then
                begin
                    t:=t mod +;
                    que[t].x:=p; que[t].use:=ti;
                    flag[p,ti]:=true;
                end;
            end;
            if ti<k then
            begin
                if dis[cur,ti]<dis[p,ti+] then
                begin
                    dis[p,ti+]:=dis[cur,ti];
                    if not flag[p,ti+] then
                    begin
                        t:=t mod +;
                        que[t].x:=p; que[t].use:=ti+;
                        flag[p,ti+]:=true;
                    end;
                end;
            end;
            q:=pre[q];
        end;
    end;
    ans:=maxlongint;
    for i:= to k do ans:=min(ans,dis[fin,i]);
    writeln(ans);
end;
 
begin
    init;
    main;
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. 名片管理系统demo

    # 定义一个列表,用来储存名片 def cardInfors(): # 打印功能提示 print('欢迎使用名片管理系统v6.6.6') print('1:添加一个名片') print('2:删除一个 ...

  2. Python3 使用 logging.basicConfig() 配置输出日志中的中文乱码解决办法

    在源码中修改encoding='utf-8',因为 logging.basicConfig() 配置时实际上是用到了4大组件,只不过给了默认值而已,如果不知道怎么找到源码,告诉你们个快捷键,选中你lo ...

  3. 不得不服!Python速度虽然慢,但是它工作效率很高!

    写在前面 让我们来讨论一个我最近一直在思考的问题:Python 的性能.顺便说一下,我是 Python 的忠实拥趸,我在各种情况下都会积极尝试使用 Python 来解决问题.大家对 Python 最大 ...

  4. 《机器学习实战》 in python3.x

    机器学习实战这本书是在python2.x的环境下写的,而python3.x中好多函数和2.x中的名称或使用方法都不一样了,因此对原书中的内容需要校正,下面简单的记录一下学习过程中fix的部分 1.pr ...

  5. 容器基础(八): 使用docker swarm部署程序

    环境 基于上一节的env/server:v0.1, env/worker:v0.1镜像, 在基于debian8.2的两台机器上测试部署docker swarm. docker service部署 ➜ ...

  6. 树莓派搭建 Hexo 博客(二)

    Hexo 一个开源的博客框架,本文记录了一下在树莓派上搭建 Hexo 博客的过程. 上一篇介绍了 Hexo 的配置,现在网站已经能在本地访问了,也能通过 hexo generate 命令生成静态界面 ...

  7. Java开发JDBC连接数据库

    Java开发JDBC连接数据库 创建一个以JDBC连接数据库的程序,包含6个步骤: JDBC五部曲1.加载驱动2.获得链接3.获取statement对象 4.执行SQL语句5.产生resultset对 ...

  8. poj1200 字符串hash 滚动哈希初探

    假如要判断字符串A“AABA”是否是字符串B“AABAACAADAABAABA”的子串 最朴素的算法是枚举B的所有长度为4的子串,然后逐个与A进行对比,这样的时间复杂度是O(mn),m为A的长度,n为 ...

  9. chromium源码阅读--图片处理

    JavaScript 图像替换 JavaScript 图像替换技术检查设备能力,然后“做正确的事”. 您可以通过 window.devicePixelRatio 确定设备像素比,获取屏幕的宽度和高度, ...

  10. ui-grid表格怎么实现内容居中

    这次是思想落后了,只关注怎么使用原生的ui-grid样式来实现这一需求,后来发现可以通过此列的cellTemplate来为列指定内容,从而可以使用css调整样式. ps:其实有时候换种思路,豁然开朗. ...