首页 > 其他分享 >分层图最短路

分层图最短路

时间:2024-02-15 15:33:23浏览次数:39  
标签:cnt val int 短路 long 分层 vector define

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

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 0x3f3f3f3f

using 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;
}

标签:cnt,val,int,短路,long,分层,vector,define
From: https://www.cnblogs.com/cxy8/p/18016228

相关文章

  • 短路在JavaScript中是如何工作的?
    在JavaScript中,理解真实和虚假的值是编写高效简洁代码的基础。结合短路的概念,开发人员可以编写优雅的解决方案来应对常见的编程挑战。在本实践指南中,我们将探讨真实值和虚假值,并了解JavaScript中短路的机制。您可以从这里获取所有源代码。(本文内容参考:java567.com)目录了......
  • 最短路学习笔记
    最短路学习笔记单源最短路径问题(SingleSourceShortestPath,SSSP问题)。Part1DijkstraPart1.0Dijkstra朴素算法洛谷P3371【模板】单源最短路径(弱化版)Dijkstra算法Dijkstra算法的流程如下:初始化$dist[1]=0$,其余节点的$dist$值为正无穷大。找出一个未被标记的......
  • 最短路径
    最短路算法主要有Floyd,Dijkstra,Bellman-Ford,SPFA,Jahnson,A*这六种算法。Floyd用来处理全源最短路,可以处理负边权。时间复杂度为\(\mathcal{O}(N^3)\)。Dijkstra用来处理单源最短路,不能处理负边权。时间复杂度最优为\(\mathcal{O}{(M\logM)}\)。Bellman-Ford用来处理单......
  • 次短路径问题
    一、问题描述P2865[USACO06NOV]RoadblocksG二、问题简析如果求最短路径,我们很自然会想到\(Dijkstra\)。但是,这道题要求的是次短路径。记到\(u\)的最短路径为\(d_1[u]\),到\(u\)的次短路径为\(d_2[u]\)。则\(d_2[v]=d_1[u]+e(u,v)\)or\(d_2[u]+e(u,v).w\)......
  • 分层架构
    分层架构(layeredarchitecture)是最常见的软件架构,也是事实上的标准架构。如果你不知道要用什么架构,那就用它。这种架构将软件分成若干个水平层,每一层都有清晰的角色和分工,不需要知道其他层的细节。层与层之间通过接口通信。虽然没有明确约定,软件一定要分成多少层,但是四层的结构......
  • 分层图
    题目描述P4568[JLOI2011]飞行路线题目分析显然,这是一道最短路径的题目,我们可以选择\(Dijkstra\)算法求解。但是,题目中有他们可以免费在最多k种航线上搭乘飞机。也就是说,我们可以令最多\(k\)条边的权值为零。这时,我们就要采用分层图。分层图分层图并不是算法,而是一种......
  • 最短路径问题
    一、Bellman-Ford算法Q:有一张有\(n\)个点、\(m\)条边的有向图,可能存在重边、负边和自环,但不存在负环,求起点\(s\)到每个点的最短路径。1.1算法简析记图为\(G\);\(G[u]\)表示以\(u\)为起点的所有边的集合;\(e(u,v)\)表示\(u\)到\(v\)的某一条有向边(\(e(u,v)\inG[......
  • r语言有限正态混合模型EM算法的分层聚类、分类和密度估计及可视化|附代码数据
    原文链接:http://tecdat.cn/?p=23825最近我们被客户要求撰写关于有限正态混合模型EM算法的研究报告,包括一些图形和统计输出。简介本文介绍了基于有限正态混合模型在r软件中的实现,用于基于模型的聚类、分类和密度估计。提供了通过EM算法对具有各种协方差结构的正态混合模型进行参......
  • 单源正权最短路径——Dijkstra算法
    目录问题引入思路一览算法原理code问题引入给出n点m边,其中边的权值皆为非负数,要求快速给出一个点到其余点的最短距离思路一览dfs遍历维护最短距离floyd算法算全源最短,但是这玩意时间复杂度O(n3),最多也就1000个点左右主角Dijkstra算法算法原理主要是以源点为根节点逐步构......
  • [数论学习笔记01]完系/同余最短路/费马小定理/扩欧/中国剩余定理
    #[数论学习笔记01]完系/同余最短路/费马小定理/扩欧/中国剩余定理###每日蒟蒻小故事(1/1)蒟蒻带了一本崭新的笔记本到S组.他发现这一节课居然在学习数论."听不懂,求讲解!"蒟蒻说.大佬邪魅一笑,并未理会.蒟蒻只能一边听着老师的讲解,一边努力地记着笔记."什么是完全剩余系......