分层图详解(不那么详细但是好理解的详解AWA)

分层图(图解+例题) 分层图 分层图多用于求最短路径,但是最短路径中可以有k条边的权值为0。 既然可以k条边为0,那么对于k条边的选取就是个问题。 所以有了分层图的概念。 对于每个点都可以选择下一条边是否赋予权值为0,那么我们就可以将图画出k+1层。 图例 我们简单画一下一个有向图,并且k=1(有一条边权值可以为0) (这是初始情况,接下来我们分层) k=1,我们要分k+1层 我们模拟从0开始,0可以走的路路径 我们可以看到,如果走同一层,那么权值就要+5或这+100,如果向上一层走那么要加上权值0,并且k减减,也 阅读详情

简介

一般我们看到在最短路中,有k条边的边权可以变化(变成0或是变成w/2基本可以大概确定是分层图的做法了),其实分层图和最短路本质上是一样的,只是在不同层之间连接了一条边,并且根据题目的条件进行转移罢了;

例题

光说理论太枯燥了,直接来看例题:P2939;例题中,可以免费k条边,那么我们可以建立k + 1个图(就是k层图,为什么这样干待会儿会解释):

    cin >> n >> m >> k;
    // STL大法好,我爱STL~!
    // 这里因为点的下标是从1开始,所以要开n+1!
    vector<vector<PII>> g(n + 1);
    while (m--)
    {
        int a, b, w;
        cin >> a >> b >> w;
        // 无向图建图
        g[a].push_back(PII(b, w));
        g[b].push_back(PII(a, w));
    }
    // k层图-->一定要记得把dist全部初始化为INF,不然会出错
    vector<vector<int>> dist(n + 1, vector<int>(k + 1, INF));

那么我们怎么去处理这个分层图呢,其实我们可以发现:每次用掉一个高速公路的机会的时候,可以看成在第k层图和第k-1层图之间建立了一条边,并且这条边的权重为0,那这样就好办了呀,就相当于是把图的点数扩大了k倍的一个图,并且在这个图上面跑一遍Dijkstra就好了呀~(其实就是通过这种方式来实现转移);
于是代码就有了:

// web:https://www.luogu.com.cn/problem/P2939
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> PII;
typedef pair<ll, ll> PLL;
const int N = 1e5 + 10;
const int INF = 0x3f3f3f3f;
const ll INFL = 1e18;

int n, m, k;

void dijkstra(vector<vector<PII>>& g, vector<vector<int>>& dist)
{
    dist[1][k] = 0;

	// 这个st存的是每个节点是否确定了最短路(Dijkstra基本知识awa)
    vector<vector<bool>> st(n + 1, vector<bool>(k + 1, false));

	// 这个优先队列的意思是{距离, {点的下标, 在第k层图(或者可以理解成还有几条告诉公路修建的机会)}}
    priority_queue<pair<int, pair<int, int>>, vector<pair<int, pair<int, int>>>, greater<pair<int, pair<int, int>>>>
        pq;
    pq.push(make_pair(0, make_pair(1, k)));

    while (pq.size())
    {
        auto t = pq.top();
        pq.pop();

        int ver = t.second.first;
        int dk = t.second.second;

        if (st[ver][dk])
            continue;
        st[ver][dk] = true;

        for (auto [j, w] : g[ver])
        {
        	// 处理在当前层上的边
            if (dist[j][dk] > dist[ver][dk] + w)
            {
                dist[j][dk] = dist[ver][dk] + w;
                pq.push(make_pair(dist[j][dk], make_pair(j, dk)));
            }
			// 相当于建立了一条边,连这其他层数
            if (dk - 1 >= 0 && dist[j][dk - 1] > dist[ver][dk] + 0)
            {
                dist[j][dk - 1] = dist[ver][dk];
                pq.push(make_pair(dist[j][dk - 1], make_pair(j, dk - 1)));
            }
        }
    }
}

signed main()
{
    ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
    cin >> n >> m >> k;

    vector<vector<PII>> g(n + 1);
    while (m--)
    {
        int a, b, w;
        cin >> a >> b >> w;
        g[a].push_back(PII(b, w));
        g[b].push_back(PII(a, w));
    }
    vector<vector<int>> dist(n + 1, vector<int>(k + 1, INF));
    dijkstra(g, dist);
    int minn = INF;
    for (int i = 0; i <= k; i++)
        minn = min(minn, dist[n][i]);
    cout << minn << endl;
    return 0;
}

补充(还不理解的建议看看)

如果还有不明白的建议看看我的另一篇博客,这篇博客就是具象化分层图,就只有两层,并且写得更详细;

DSP28335与Vofa+上位机通信实战:SCIb配置避坑指南(附完整代码) 本文提供DSP28335与Vofa+上位机通信的实战指南,重点解析SCIb模块配置的常见问题与解决方案。针对研旭开发板的硬件连接、波特率精确计算、FIFO高效使用以及FireWater协议封装进行了详细说明,并附有完整代码,帮助开发者快速实现实时数据可视化与波形分析,提升调试效率。 阅读详情

相关推荐

整理的15个公开且可直接使用的电力视觉输电线路领域数据集

而巡检数据是目前来说影响我们做科研的最大阻碍,为此本内容主要总结了,现有的且公开免费的巡检数据集,供大家使用。STN PLAD数据集133个航拍图像,五个电力部件:电力塔及其塔的ID、绝缘子,防震锤,联板(yoke),图像的尺寸在5472×3648到5472×3078。IDID数据集:2000张图像,包含三个类别,正常绝缘子,破损绝缘子和闪络绝缘子三个类别,用于目标检测的实验。TTPLA数据集,用于实例分割,1100张尺寸为3840×2160,包含两个类别,电力杆塔和电力线。主要用于电力杆塔的目标检测。

weixin_42048361的博客 5015

分层图-初级理解

欢迎来到算法解析专题,若写的有不好的地方还望指出 如果喜欢的话不要忘记点点赞点点关注吧,在我主页便可查看更多的算法解析,如果哪位大佬发现本篇博客有问题的话,可以私聊我。感谢各位大佬对本蒻蒻的支持

qq_66909106的博客 3236

拆解歌尔2718硅麦:2.75mm超小封装背后的MEMS技术解析

本文深度解析歌尔2718硅麦的2.75mm超小封装技术,探讨MEMS麦克风在微型化过程中的声学性能与结构可靠性平衡。通过ASIC芯片堆叠、纳米级应力控制等创新技术,歌尔2718在TWS耳机和智能手机中实现卓越性能,同时克服微型化带来的声学挑战。

weixin_28292761的博客 610

图论建模——分层图详解

分层图,顾名思义。是将原图按不同状态分为若干与原图连接方式相同的图层,图层之间以特定方式连接的一类建图方式。如果画成立体图,大概是这样的:假设原图位于0{0}0层,总共有kkk层图。那么对于任意i∈1ki\in[1,k]i∈1k,层iii内的节点之间的连接方式与0{0}0层是完全相同的(与原图连接方式相同);但是层与层之间的连接方式不一定相同,具体取决于题意假设不考虑节点所在层,仅考虑它在原图上对应的编号。假设有一条无向边SV(S,V)SV。

m0_74315382的博客 5547

ctfshow WEB web4

ctfshow WEB web4

weixin_68416970的博客 721

Matlab2021a破解版安装与激活实战教程(含详细步骤截图)

本文详细介绍了MATLAB R2021a的正版安装流程与核心功能优化,包括系统要求、安装步骤、性能调优及深度学习工具箱的应用。通过实战教程和代码示例,帮助用户高效搭建开发环境并掌握关键技术,特别适合工程计算与科学研究的专业人士。

vvv99的博客 460

分层图总结

分层图总结(定义,实现,最短路)

x052xiao的博客 3148

七星棋牌顶级运营产品全开源修复版源码教程:6端支持,200+子游戏玩法,完整搭建指南(含代码解析)

让您从源码下载到本地运行一步到位!此外,文中还将附带详细代码解析与操作步骤,即便没有开发经验,也能轻松完成二开与定制。数据库是棋牌游戏中极为关键的组成部分,用于存储用户信息、乐豆余额、游戏记录、提现申请等数据。以下是部分核心数据表结构示例,便于存储用户信息与游戏记录。AI模块能够控制游戏中的胜率,常用于调节玩家体验。防沉迷功能旨在限制未成年人游戏时间。的完整搭建流程,特别适合。首先,获取七星棋牌源码。本教程将为您详细讲解。

aa2031171的博客 7777

图论之分层图最短路总结 与经典例题

一、分层图 分层图只是建图时有区别,但跑最短路板子都是一样的,正所谓图论最难的就是建图,只要有合适的建图方法,那么问题就很简单了。 分层图是指有很多个平行的图,各个平行的图之间有特殊的连接边。 用分层图的几种情况:1、有k个不同集合的边,将每个集合内的边建成一张图,再建立第k+1个图,是一个虚层,用这个虚层将这k张图连接起来。每次可以通过虚层转移到另一个集合的图中。如例1.小雨坐地铁。2、有k个机会使得走当前此边不花费代价或花费特殊的代价,可以建立k张相同的该图,每张图之间用有边的点连接起来,其代价是0或是

harry12138小白的博客 7962

CMOS锁相环核心:四种鉴频鉴相器(PFD)结构深度剖析与选型指南

本文深入剖析了CMOS锁相环中四种鉴频鉴相器(PFD)的结构与性能,包括传统RS触发器型、非时钟型、预充电型和边沿触发型PFD。通过详细的电路分析、实测数据和工程案例,提供了PFD选型的实用指南,帮助工程师根据速度、功耗和精度需求选择最优方案,提升锁相环设计效率。

weixin_42530458的博客 587

MTEX包在Matlab中实现从EBSD数据生成Abaqus网格与晶粒取向:一种对用户材料旋转矩阵分量实践的全面指南

此教程提供了一种使用MTEX Matlab包处理EBSD数据的方法,并生成Abaqus输入文件,这对于进行多晶体有限元分析具有极大的帮助。但值得注意的是,这只是一个基本的例子,实际应用中可能需要根据您的实际需求进行调整。MTEX包还提供了许多其他的功能,可以进行更复杂的分析和处理,我非常推荐您去探索。希望这篇文章能对您有所帮助,如果您有任何疑问或建议,欢迎留言交流。在接下来的文章中,我将会介绍更多关于MTEX的高级功能,敬请期待。– (完)–

qq_38334677的博客 4437

最大流 https://comzyh.com/blog/archives/568/

“网络流博大精深”—sideman语 一个基本的网络流问题点击打开链接 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张. [1]是源点,有无限的水量,[4]是汇点,管道容量如图所示.试问[4]点最大可接收的水的流

一念风华的博客 937

【软考高项论文】论信息系统项目管理的干系人绩效域

例如,在处理与电信运营商合作铺设光纤网络的问题时,考虑到其在通信设施建设和运维方面的专业性和重要性,我们将之定位为高权力高利益的干系人,给予了高度关注和优先沟通。项目全程,我们对干系人绩效域的执行效果进行了定期检查和评估,通过定量与定性的数据收集,确认了项目在干系人管理上的成效,具体表现为:建立了稳固的工作关系网络,使干系人普遍认可项目目标;鉴于本项目牵涉到政府各级部门、企事业单位、市民团体、技术研发伙伴等多种类型的干系人,且干系人的诉求和影响力各异,因此,有序且持续的干系人参与管理显得尤为关键。

Programming Talk 1681

Dinic算法用于求最大流

网络流入门—用于最大流的Dinic算法 Posted 2011年05月2日 by comzyh 转自http://comzyh.com/blog/archives/568/ “网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定

susandebug 1259

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

网络流入门—用于最大流的Dinic算法

网络流入门—用于最大流的Dinic算法 Posted 2011年05月2日 by comzyh “网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有

Turne的博客 987

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

dinic 算法 基本思想及其模板

“网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张. [1]是源点,有无限的水量,[4]是汇点,管道容量如图所示.试问[4]点最大可接收的水的流量? 这便是简单的最大流...

weixin_30563917的博客 225

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

网络流初步——dinic算法

本文介绍dinic算法比较详细 转载自:http://comzyh.com/blog/ “网络流博大精深”—sideman语 一个基本的网络流问题 感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D

Green_Days 380

网络流入门--最大流算法Dicnic 算法

感谢WHD的大力支持 最早知道网络流的内容便是最大流问题,最大流问题很好理解: 解释一定要通俗! 如右图所示,有一个管道系统,节点{1,2,3,4},有向管道{A,B,C,D,E},即有向图一张. [1]是源点,有无限的水量,[4]是汇点,管道容量如图所示.试问[4]点最大可接收的水的流量? 这便是简单的最大流问题,显然[4]点的最大流量为50 死理性派请注意:流量是单位时间内的,总可

苦鬼·。 3119

图论学习:分层图

分层图的应用范围: 比如最短路、网络流等,题目对边的权值提供可选的操作,比如可以将一定数量的边权减半,在此基础上求解最优解。 分层图的构建步骤可以描述为: 1、先将图复制成 k+1 份 (0 ~ k) 2、对于图中的每一条边 <u,v> 从 ui 到 vi+1 建立与题目所给操作相对应的边(i=0,1,…,k) k代表了进行操作的次数,而每层之间点的关系代表了何时进行操作。 例题1: 洛谷P4822 [BJWC2012]冻结 题意:给你一个n个点m条边的无向带权图,每条边有一个通过时间w,现

qq_43597227的博客 3737

分层图最短路--最通俗易懂的讲解

分层图最短路是指在可以进行分层图的图上解决最短路问题。分层图:可以理解为有多个平行的图。 一般模型是:在一个正常的图上可以进行k次决策,对于每次决策,不影响图的结构,只影响目前的状态或代价。一般将决策前的状态和决策后的状态之间连接一条权值为决策代价的边,表示付出该代价后就可以转换状态了。 一般有两种方法解决分层图最短路问题: 建图时直接建成k+1层。 多开一维记录机会信息。 当然具...

sugarbliss 1万+

浅谈分层图

简单学习分层图并附带一些题

qq_43052183的博客 2429

拆点/分层图的使用

6

qq_73169752的博客 370

分层图

写在前面的费话:分层图似乎是一个非常简单的东西,总就得被大佬看见这篇博客会笑我是个菜鸡(不过没关系,反正实锤是菜鸡了orz)。不过最近发现以前学的东西和做过的题老是很快就忘了,所以觉得还是该记录一下。 适用场景:一些图论题,比如最短路、网络流等,题目对边的权值提供可选的操作,比如可以将一定数量的边权减半,在此基础上求解最优解。 算法思路:根据是否进行题目提供的操作以及操作次数的不同,会产生非常多的...

diker 的博客 1万+

分层图最短路

题目思路:由于有K次机会可以免费,所以应该建立K+1层最短路(每向下一次代表一次免费路径),每一层正常建图,层层之间用边权为0的线连接。从start开始跑一次最短路,比较到达每一层的end,选一个最小的。思路:第一,二层正常建图,层与层之间用边权为0的线连接(代表免费的一次移到),第三层一个虚拟的点,与第一层之间用边权为a[i]的线对应连接(代表最终选择在哪个岛上渡劫)。代码参考了一些题解,根据自己的理解写了一遍。总的来说找到正确的建图就成功了百分之九十九。主要是考虑怎么建图,最后跑一下最短路板子就行。

2301_79896098的博客 602
上一篇: 一个各种常用但是容易忘记的模版的文章(持续更新)
下一篇: 完全背包问题代码细节
ResCells
博客等级 码龄4年 191粉丝 26原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值