我们用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. 【个人训练】The Cow Lexicon(POJ-3267)

    继续大战dp.2018年11月30日修订,更新一下现在看到这个题目的理解(ps:就现在,poj又503了). 题意分析 这条题目的大意是这样的,问一字符串内最少删去多少的字符使其由给定的若干字符串构成 ...

  2. 生产者与消费者-N:1-基于list

    多个生产者/一个消费者: /** * 生产者 */ public class P { private MyStack stack; public P(MyStack stack) { this.sta ...

  3. Python网络编程(socketserver、TFTP云盘、HTTPServer服务器模型)

    HTTP协议? HTTP是一个应用层协议,由请求和响应构成,是一个标准的客户端服务器模型.HTTP是一个无状态的协议. 通常承载于TCP协议之上,有时也承载于TLS或SSL协议层之上,这个时候,就成了 ...

  4. Prometheus 普罗米修斯监控

    周末在家无聊 看新闻 看到关于监控的东西 拿来玩玩 试一下 感觉还蛮有意思 特此记录一下 这里只介绍客户端的配置 1:首先在POM中添加依赖 <dependency> <groupI ...

  5. LeetCode - 3. Longest Substring Without Repeating Characters(388ms)

    Given a string, find the length of the longest substring without repeating characters. Examples: Giv ...

  6. Win7系统下删除文件时出现“正在准备再循环”的解决方法

    今天,笔者在备份文件的时候,将一个word文档从移动硬盘复制到桌面.经过一系列“复(meng)杂(bi)”的操作之后,笔者突然发现,文件无法删除了.当右键文件点击“删除”时,出现对话框显示“正在准备 ...

  7. HDU 4735 Little Wish~ lyrical step~(DLX搜索)(2013 ACM/ICPC Asia Regional Chengdu Online)

    Description N children are living in a tree with exactly N nodes, on each node there lies either a b ...

  8. Java 多态方法构造器执行方法

    我们参考下面这个例子: 读者可以提前考虑一下,这段程序的输出会是什么. public class Polymorphism { /** * 创建一个类A * 该类中有一个方法draw,以及一个构造方法 ...

  9. 文件系统之 stat与access

    stat命令 stat既有命令也有同名函数,用来获取文件Inode里主要信息,所以stat命令的输出信息比ls命令的输出信息要更详细,stat 跟踪符号链接,lstat不跟踪符号链接,其中会输出对应文 ...

  10. 【SSH】——两种添加jar包方式的比较

    [前言] 在开发过程中,我们对Eclipse或MyEclipse等IDE越来越熟悉了.在使用的过程中,小编了解到两种添加jar包的方式,今天给大家说下这两种方式的差别. 方法一: 将所需要的jar包拷 ...