分层图最短路

分层最短路用更加具体或者形象一点的说法就是有限制的最短路径问题。
通常是拆点解决问题,原图中的点加上一个当前点的状态,成为一个新的点

P4568 [JLOI2011] 飞行路线

P4568 [JLOI2011] 飞行路线

#include <bits/stdc++.h> 
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define inf 0x3f3f3f3fusing namespace std;void solve()
{int n,m,k;cin>>n>>m>>k;int s,t;cin>>s>>t;vector<vector<pii>>g(n+1);rep(i,1,m){int u,v,w;cin>>u>>v>>w;//无向图,建双向边g[u].pb({v,w});g[v].pb({u,w});}struct node{int val,u,cnt;//大根堆只能重载小于号,小根堆只能重载大于号bool operator<(const node&t)const{return val>t.val;}};priority_queue<node>q;vector<vector<int>>d(n+1,vector<int>(k+1,0x3f3f3f3f));vector<vector<int>>vis(n+1,vector<int>(k+1));d[s][0]=0;q.push({0,s,0});while(q.size()){auto t=q.top();q.pop();int val=t.val,u=t.u,cnt=t.cnt;if(vis[u][cnt])	continue;vis[u][cnt]=1;for(auto it:g[u]){int v=it.x,w=it.y;//不用免费的机会if(d[v][cnt]>d[u][cnt]+w){d[v][cnt]=d[u][cnt]+w;q.push({d[v][cnt],v,cnt});}//用免费的机会if(cnt<k&&d[v][cnt+1]>d[u][cnt]){d[v][cnt+1]=d[u][cnt];q.push({d[v][cnt+1],v,cnt+1});}}}int res=0x3f3f3f3f*1ll;rep(i,0,k){res=min(res,d[t][i]);}cout<<res<<endl;
}signed main(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//   	freopen("1.in", "r", stdin);int _;
//	cin>>_;
//	while(_--)solve();return 0;
}

在这里插入图片描述
在这里插入图片描述

图论真难qwq
这道题目也可以用分层图的思想,或者dp的思想去解决
分层图并不一定要把图建出来,只需要进行拆点。
对于这类有选择会导致不同结果的可以通过拆点来解决
把原图上的点加上到达该点时的状态结合产生新的点。
这道题目和最短路的转移也不一样了,与其说是最短路但是感觉更像是用队列去写的dp,因为题目中并没有说是 D A G DAG DAG
d [ u ] [ c n t ] : 表示到达 u 点前面已经用过 c n t 次的最大边权 d[u][cnt]:表示到达u点前面已经用过cnt次的最大边权 d[u][cnt]:表示到达u点前面已经用过cnt次的最大边权
转移:考虑使用和不使用
不使用

//不用这次免费的边
if(max(d[u][cnt],w)<d[v][cnt]){d[v][cnt]=max(d[u][cnt],w);if(!inq[v][cnt]){q.push({v,cnt});inq[v][cnt]=1;
}

使用:需要还有次数才能使用

//使用
if(cnt<k&&d[u][cnt]<d[v][cnt+1]){d[v][cnt+1]=d[u][cnt];if(!inq[v][cnt+1]){q.push({v,cnt+1});inq[v][cnt+1]=1;}
}
#include <bits/stdc++.h> 
#define int long long
#define rep(i,a,b) for(int i = (a); i <= (b); ++i)
#define fep(i,a,b) for(int i = (a); i >= (b); --i)
#define pii pair<int, int>
#define ll long long
#define db double
#define endl '\n'
#define x first
#define y second
#define pb push_back
#define inf 0x3f3f3f3f*1llusing namespace std;void solve()
{int n,m,k;cin>>n>>m>>k;vector<vector<pii>>g(n+1);rep(i,1,m){int u,v,w;cin>>u>>v>>w;g[u].pb({v,w});g[v].pb({u,w});}vector<vector<int>>inq(n+1,vector<int>(k+1,0));vector<vector<int>>d(n+1,vector<int>(k+1,0x3f3f3f3f));queue<pii>q;d[1][0]=0;inq[1][0]=1;q.push({1,0});//跑一遍最短路while(q.size()){auto t=q.front();q.pop();int u=t.x,cnt=t.y;inq[u][cnt]=0;for(auto it:g[u]){int v=it.x,w=it.y;//不用这次免费的边if(max(d[u][cnt],w)<d[v][cnt]){d[v][cnt]=max(d[u][cnt],w);if(!inq[v][cnt]){q.push({v,cnt});inq[v][cnt]=1;}}//使用if(cnt<k&&d[u][cnt]<d[v][cnt+1]){d[v][cnt+1]=d[u][cnt];if(!inq[v][cnt+1]){q.push({v,cnt+1});inq[v][cnt+1]=1;}}}}int res=inf;rep(i,0,k){res=min(res,d[n][i]);}cout<<(res==inf?-1:res)<<endl;
}signed main(){ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
//   	freopen("1.in", "r", stdin);int _;
//	cin>>_;
//	while(_--)solve();return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/470683.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2024.2.14

1.请编程实现二维数组的杨慧三角 #include<stdio.h> #include<string.h> int main(int argc, const char *argv[]) { int n,i,j;printf("please enter n:");scanf("%d",&n);int arr[n][n];for(i0;i<n;i){for(j0;j<i;j){if(j0 || ij…

C++类和对象-多态->多态的基本语法、多态的原理剖析、纯虚函数和抽象类、虚析构和纯虚析构

#include<iostream> using namespace std; //多态 //动物类 class Animal { public: //Speak函数就是虚函数 //函数前面加上virtual关键字&#xff0c;变成虚函数&#xff0c;那么编译器在编译的时候就不能确定函数调用了。 virtual void speak() { …

C++文件操作->文本文件(->写文件、读文件)、二进制文件(->写文件、读文件)

#include<iostream> using namespace std; #include <fstream>//头文件包含 //文本文件 写文件 void test01() { //1.包含头文件 fstream //2.创建流对象 ofstream ofs; //3.指定打开方式 ofs.open("test.txt", ios::out); //4.写…

将人工智能应用于 DNS 流量以阻止恶意软件感染

Infoblox Inc. 透露&#xff0c;它正在利用人工智能 (AI) 来识别恶意软件来源的网站。然后可以阻止这些网站以使 IT 环境更加安全。 Infoblox 产品管理副总裁 Craig Sanderson 桑德森表示&#xff0c;SOC Insights 将机器学习算法应用于 BloxOne 威胁防御平台域名服务器 (DNS)…

[职场] 生育津贴如何申领与计算 #经验分享#微信#职场发展

生育津贴如何申领与计算 生育津贴如何申领? 生育津贴即为产假工资&#xff0c;相当于女职工在享受符合生育政策休假期间的工资。生育津贴高于本人产假工资标准的&#xff0c;用人单位不得克扣生育津贴低于本人产假工资标准的&#xff0c;差额部分由用人单位补足。 一、大部…

ArcgisForJS基础

文章目录 0.引言1.第一个ArcgisForJS应用程序1.1.安装部署ArcgisForJS1.2.实现ArcgisForJS应用程序 2.开发与调试工具2.1.集成开发环境2.2.调试工具2.3.Firebug 0.引言 ArcGIS API for JavaScript是一款由Esri公司开发的用于创建WebGIS应用的JavaScript库。它允许开发者通过调…

Vi 和 Vim 编辑器

Vi 和 Vim 编辑器 vi 和 vim 的基本介绍 Linux 系统会内置 vi 文本编辑器 Vim 具有程序编辑的能力&#xff0c;可以看做是 Vi 的增强版本&#xff0c;可以主动的以字体颜色辨别语法的正确性&#xff0c;方便程序设计。 代码补完、编译及错误跳转等方便编程的功能特别丰富&…

探索设计模式的魅力:创建型设计模式的比较与决策

设计模式专栏&#xff1a;http://t.csdnimg.cn/U54zu 目录 一、设计模式概览 1.1 创建型模式 二、比较创建型设计模式 1.1 适用场景典型用例 1.2 关键要素与差异对比 1.3 结构图 三、模式选择指南 3.1 场景分析 3.2 决策流程图 四、结语 4.1 优势 4.2 考量因素 一、…

MySQL 基础知识(六)之数据查询(二)

目录 6 数值型函数 7 字符串函数 8 流程控制函数 9 聚合函数 10 分组查询 (group by) 11 分组过滤 (having) 12 限定查询 (limit) 13 多表查询 13.1 连接条件关键词 (on、using) 13.2 连接算法 13.3 交叉连接 (cross join) 13.4 内连接 (inner join) 13.5 外连接 …

装饰工程|装饰工程管理系统-项目立项子系统的设计与实现|基于Springboot的装饰工程管理系统设计与实现(源码+数据库+文档)

装饰工程管理系统-项目立项子系统目录 目录 基于Springboot的装饰工程管理系统设计与实现 一、前言 二、系统功能设计 三、系统实现 1、管理员功能实现 &#xff08;2&#xff09;合同报价管理 &#xff08;3&#xff09;装饰材料总计划管理 &#xff08;4&#xff0…

边缘计算:重塑数字世界的未来

引言 随着物联网&#xff08;IoT&#xff09;设备的激增和5G网络的普及&#xff0c;我们正站在一个计算模式的新纪元门槛上——边缘计算。这一技术范式将数据处理和分析推向网络的边缘&#xff0c;即设备或终端&#xff0c;为实时性要求较高的应用提供了前所未有的可能性。 目…

Unity如何修改预制体(预制件)?

文章目录 19 复制复制复制&#xff0c;预制体与变体 19 复制复制复制&#xff0c;预制体与变体 【预制件】 预制件作用&#xff1a;方便复用 【预制件】的制作 直接拖拽&#xff0c;从层级面板 -> 项目面板。层级面板中当前图标会变蓝&#xff0c;子物体名字变蓝色。预制件…