分层图

分层图多用于求最短路径,但是最短路径中可以有k条边的权值为0。

既然可以k条边为0,那么对于k条边的选取就是个问题。
所以有了分层图的概念。

对于每个点都可以选择下一条边是否赋予权值为0,那么我们就可以将图画出k+1层。

图例

我们简单画一下一个有向图,并且k=1(有一条边权值可以为0)


(这是初始情况,接下来我们分层)
k=1,我们要分k+1层

我们模拟从0开始,0可以走的路路径

我们可以看到,如果走同一层,那么权值就要+5或这+100,如果向上一层走那么要加上权值0,并且k减减,也就是每次移动可以消耗免费次数和不消耗免费次数这两种情况可以选择!

那么剩下的情况大家可以手动画一下。

代码实现

我们可以将dis数组开成二维dis[i][j]表示到达i号结点,用了j次免费操作!
比如dis[2][0]表示到达2号结点,没有用免费操作,也就是在第一层图移动。
比如dis[2][3],到达2号结点用了3次免费操作,那么下一次移动应该在第3/4层图进行!

注意理解上述操作!

接下来是一道例题,大家可以动手完成。(我用的是dijkstra+优先队列优化,完成k次免费的最短路径问题)

飞行路线

#include <bits/stdc++.h>using namespace std;
const int maxn=1e4+10;
int dis[maxn][15],vis[maxn][15],head[maxn];
int n,m,k,sum;
int start,last;
struct node
{int id,v,used;//used使用了几次免费券node() {}node(int id,int v,int used):id(id),v(v),used(used) {}bool  operator <(const node b) const{return v>b.v;}
};
//链式前向星构图
struct edge
{int to,next,w;
} edge[maxn<<1];void add(int u,int v,int w)
{edge[++sum].to=v;edge[sum].next=head[u];edge[sum].w=w;head[u]=sum;
}void dijkstra(int start)
{memset(dis,0x7f7f7f7f,sizeof(dis));priority_queue<node> q;q.push(node(start,0,0));dis[start][0]=0;while(!q.empty()){node t=q.top();q.pop();int u=t.id;int kk=t.used;if(vis[u][kk])continue;vis[u][kk]=1;for(int i=head[u]; i; i=edge[i].next){int v=edge[i].to;int w=edge[i].w;//两种情况,用免费和不用免费//不用if(dis[v][kk]>dis[u][kk]+w){dis[v][kk]=dis[u][kk]+w;q.push(node(v,dis[v][kk],kk));}//用免费券if(kk+1<=k&&dis[v][kk+1]>dis[u][kk]+0){dis[v][kk+1]=dis[u][kk];q.push(node(v,dis[v][kk+1],kk+1));}}}
}int main()
{scanf("%d%d%d",&n,&m,&k);scanf("%d%d",&start,&last);for(int i=1; i<=m; i++){int u,v,w;scanf("%d%d%d",&u,&v,&w);add(u,v,w);add(v,u,w);}dijkstra(start);int ans=0x7f7f7f7f;for(int i=0;i<=k;i++){ans=min(ans,dis[last][i]);}printf("%d\n",ans);return 0;
}

如果对你有帮助多多点赞支持!

分层图(图解+例题)相关推荐

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

    一.分层图 分层图只是建图时有区别,但跑最短路板子都是一样的,正所谓图论最难的就是建图,只要有合适的建图方法,那么问题就很简单了. 分层图是指有很多个平行的图,各个平行的图之间有特殊的连接边. 如何更 ...

  2. 动图图解!既然IP层会分片,为什么TCP层也还要分段?

    文章持续更新,可以微信搜一搜「golang小白成长记」第一时间阅读,回复[教程]获golang免费视频教程.本文已经收录在GitHub https://github.com/xiaobaiTech/g ...

  3. 图论 ---- E. Minimum Path(分层图最短路 用分层图对边权操作进行选择)

    题目链接 题目大意: 两点间最短路的定义变成:所有的边之和−max+min所有的边之和-max+min所有的边之和−max+min 解题思路: 这里很明显就是变成了最短路的时时候就是把路径上边权最小值 ...

  4. CF990G GCD Counting(树上莫比乌斯反演,分层图,并查集)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 Problem 给定一棵点带权无根树,对于每个 k∈[1,2×105]k\in[1,2\times10 ...

  5. [NOIP2009] 最优贸易 (最短路,分层图)

    题目链接 Solution 分层图+\(SPFA\). 建立3层图,其中每一层之中的边权赋为0. 对于任意一条边 \(t\) ,其起点 \(x\) 和终点 \(y\). 我们将 \(x\) 在第一层的 ...

  6. BZOJ2662[BeiJing wc2012]冻结——分层图最短路

    题目描述 "我要成为魔法少女!"      "那么,以灵魂为代价,你希望得到什么?"  "我要将有关魔法和奇迹的一切,封印于卡片之中„„"  ...

  7. 动图图解C语言插入排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  8. 动图图解C语言选择排序算法,含代码分析

    C语言文章更新目录 C语言学习资源汇总,史上最全面总结,没有之一 C/C++学习资源(百度云盘链接) 计算机二级资料(过级专用) C语言学习路线(从入门到实战) 编写C语言程序的7个步骤和编程机制 C ...

  9. 【线性规划与网络流24题】孤岛营救问题 分层图

    孤岛营救问题 Time Limit: 1 Sec  Memory Limit: 128 MB Description 1944年,特种兵麦克接到国防部的命令.要求马上赶赴太平洋上的一个孤岛,营救被敌军 ...

最新文章

  1. 你知道Spring Boot项目是怎么启动的吗?
  2. 复位 stm32_stm32学习笔记
  3. BJFU fudq的等式
  4. 贪心算法区间调度问题思路代码证明
  5. C# byte[]、struct、intptr等的相互转换
  6. JSTL EL对Map集合的支持
  7. quasar 异步回调_Java IO基准测试:Quasar与异步ForkJoinPool与ManagedBlock
  8. 用python实现远程复制 (scp + expect )
  9. Python_urllib
  10. cuda11.0 cudnn 11.0 torch1.7.1+cu110 torchvision 0.8.2+cu110 安装包
  11. 小猿圈WEB前端之HTML5+CSS3面试题(一)
  12. 程序设计与c语言区别,c语言程序设计和c程序设计有什么区别啊
  13. 常用的VBA代码参考
  14. catia工程图纸中如何画图_catia工程图 方法和步骤
  15. pycharm怎么修改html的字体大小,怎么改pycharm的字体大小
  16. springboot记录用户访问次数_Spring Boot入门(12)实现页面访问量统计功能
  17. 微信小程序-将时间转换成几秒前 几分钟前 几小时前 几天前等时间格式
  18. Teamviewer检测为商业用途的解决方案
  19. 盘点2018上半年最受欢迎的前端开发!
  20. 详述 IntelliJ IDEA 遇到快捷键以及删除键不好使的解决方法

热门文章

  1. jsfor循环终止_JavaScript跳出循环的三种方法(break, return, continue)
  2. pytorch学习笔记1
  3. 【go共识算法】-PBFT
  4. 端游绝地求生为什么服务器维护,《绝地求生大逃杀》PC版今日服务器维护3小时 原因未知 或与新地图有关?...
  5. pdf文档打印小册子
  6. Mysql —— 子查询的 ”必备“ 练习
  7. visual studio 2017光标变成一闪一闪的小方块
  8. EditText输入字母自动大写
  9. 现货黄金行情分析小技巧
  10. java大话西游_Java设计模式_行为型_备忘录模式_大话西游之月光宝盒