我们用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. Linux中java应用程序的部署,使其开机自动启动

    初步需求:将在Windows/MyEclipse中开发的java应用程序部署到Linux服务器上,使其运行 针对需求,可以参考下面这些文章,但是这些文章很多东西没有提及到,我自己尝试部署运行 在lin ...

  2. 小程序如何去掉button组件的边框

    小程序获取用户授权不再支持wx.getUserInfo方法,改为用button获取,格式如下 <button class="btn btn" open-type=" ...

  3. idea在Maven Projects中显示灰色的解决办法

    问题描述: 在使用idea的过程中,遇到其中一个maven模块变成灰色,如下所示: 问题解决: 造成这个的原因可能是忽略了maven模块. 可以尝试如下解决方法:在idea中进入Settings–&g ...

  4. 第七篇Python基本数据类型之数字&字符串&布尔值

    数字 写在最前,必须要会的:int() 整型 Python3里无论数字多长都用int表示,Python2里有int和Long表示,Long表示长整型 有关数字的常用方法,方法调用后面都必须带括号() ...

  5. django中判断当前user具有是否有对模块的增删改查权限

    首先简单了解一下user的一些属性 User对象 User对象是认证系统的核心.用户对象通常用来代表网站的用户,并支持例如访问控制.注册用户.关联创建者和内容等.在Django认证框架中只有一个用户类 ...

  6. Queue模块初识

    Queue模块实现了多生产者.多消费者队列.它特别适用于信息必须在多个线程间安全地交换的多线程程序中.这个模块中的Queue类实现了所有必须的锁语义.它依赖于Python中线程支持的可用性:参见thr ...

  7. c# 自动关机代码

    #region 关机代码 //C#关机代码 // 这个结构体将会传递给API.使用StructLayout //(...特性,确保其中的成员是按顺序排列的,C#编译器不会对其进行调整. [Struct ...

  8. web四则运算

    目录 1.coding.net地址 2.PSP 3.Information Hiding, Interface Design, Loose Coupling 4.计算模块接口的设计与实现过程 5.计算 ...

  9. linux基础优化

    [root@moban oldboy]# for oldboy in `chkconfig --list |grep "3:on" |awk '{print $1}' |grep ...

  10. Java使用泛型的困顿

    原文有点儿胡说的意味,删了,有空再次更新这篇博文~