P4568 飞行路线 分层图最短路
P4568 飞行路线 分层图最短路
分层图最短路
问题模型
求最短路时,可有\(k\)次更改边权(减为0)
思路
在普通求\(Dijkstra\)基础上,\(dis[x][j]\)多开一维\(j\)以存已用了多少次机会,然后每次松弛时,做完普通松弛操作后,还要使用一次机会(如果可以),类同\(DP\)。
每次普通松弛:
\[ dis[to][j]=min\{dis[cur][j], dis[to][j]\} \]
如果还可以使用(\(j<k\)):
\[ dis[to][j+1] = min\{dis[cur][j], dis[to][j+1]\} \]
AC Code:
#include <cstdio>
#include <vector>
#include <cstring>
#include <queue>
#define MAXN 10010
#define MAXK 11
#define MIN(A,B) ((A)<(B)?(A):(B))
using namespace std;
int n,m,k,s,e;
bool vis[MAXN][MAXK];
struct edge{int v,w;edge(int v, int w):v(v),w(w){}
};
vector <edge> mp[MAXN];
struct item{int dis, k, v;item(int dis, int k, int v):dis(dis), k(k), v(v){}bool operator < (const item a) const{return dis > a.dis;}
};
int dis[MAXN][MAXK];
priority_queue <item> q;
void Dij(){memset(dis, 0x3f, sizeof(dis));dis[s][0]=0;q.push(item(0,0,s));while(!q.empty()){item cur = q.top();q.pop();if(vis[cur.v][cur.k]) continue;vis[cur.v][cur.k] = 1;for(register int i=0;i<mp[cur.v].size();++i){int v = mp[cur.v][i].v, w = mp[cur.v][i].w;if(cur.k<k&&!vis[v][cur.k+1]&&dis[v][cur.k+1]>dis[cur.v][cur.k]){ // 使用机会dis[v][cur.k+1] = dis[cur.v][cur.k];q.push(item(dis[v][cur.k+1], cur.k+1, v));}if(!vis[v][cur.k]&&dis[v][cur.k]>dis[cur.v][cur.k]+w){ // 普通松弛dis[v][cur.k] = dis[cur.v][cur.k]+w;q.push(item(dis[v][cur.k], cur.k, v));}}}
}
int main()
{scanf("%d %d %d %d %d", &n, &m, &k, &s, &e),s++,e++;for(int i=1;i<=m;++i){int a,b,c;scanf("%d %d %d", &a, &b, &c),++a,++b;mp[a].push_back(edge(b,c));mp[b].push_back(edge(a,c));}Dij();int ans=0x3ffffff;for(int i=0;i<=k;++i)ans = MIN(ans, dis[e][i]); // 遍历统计答案,机会不一定用完printf("%d", ans);return 0;
}
转载于:https://www.cnblogs.com/santiego/p/10803284.html
P4568 飞行路线 分层图最短路相关推荐
- 洛谷 - P4568 [JLOI2011]飞行路线(分层图最短路)
题目链接:点击查看 题目大意:给出一张图,每条边都有权值,现在要求从点st到达点ed,沿途中可以让k条边的边权免费,现在求最短路 题目分析:分层图经典模板问题,直接套板子就行了,最后记得对于数组d的每 ...
- 图论 ---- E. Minimum Path(分层图最短路 用分层图对边权操作进行选择)
题目链接 题目大意: 两点间最短路的定义变成:所有的边之和−max+min所有的边之和-max+min所有的边之和−max+min 解题思路: 这里很明显就是变成了最短路的时时候就是把路径上边权最小值 ...
- BZOJ2662[BeiJing wc2012]冻结——分层图最短路
题目描述 "我要成为魔法少女!" "那么,以灵魂为代价,你希望得到什么?" "我要将有关魔法和奇迹的一切,封印于卡片之中„„" ...
- 洛谷 - P4009 汽车加油行驶问题(分层图最短路/最小费用最大流)
题目链接:点击查看 题目大意:给出一个n*n的矩阵表示道路,途中有一些加油站,现在要从点(1,1)到达点(n,n),问最小花费,其中的一些规则如下: 汽车只能沿着网格边行驶,装满油后可以行驶K条边,出 ...
- POJ - 3662 Telephone Lines(分层图最短路)
题目链接:点击查看 题目大意:在郊区有N座通信基站,P条双向电缆,第i条电缆连接基站Ai和Bi.特别的,1号基站是通信公司的总站,N号基站位于一座农场中.现在,农场主希望对通信线路进行升级,其中升级第 ...
- codeforces1473 E.Minimum Path(分层图最短路)
E - Minimum Path 分层图最短路 第一个分层图 第0层就是按照题中给的点连边,从第0层到第1层我们连一条边权是0的边,从第1层到第2层连一条边权是原先边权2倍的边,当然第1层以及第2层之 ...
- 【bzoj2834】回家的路 分层图最短路
题目描述 输入 输出 样例输入 2 1 1 2 1 1 2 2 样例输出 5 题解 分层图最短路 dis[i][0]表示到i为横向时起点到i的最短路,dis[i][1]表示到i为纵向时起点到i的最短路 ...
- 【算法练习】CodeVs1391 伊吹萃香(分层图最短路)
题意 在幻想乡,伊吹萃香是能够控制物体密度的鬼王.因为能够控制密度,所以萃香能够制造白洞和黑洞,并可以随时改变它们.某一天萃香闲着无聊,在妖怪之山上设置了一些白洞或黑洞,由于引力的影响,给妖怪们带来了 ...
- Loj#6223 Luogu P4009 汽车加油行驶 分层图最短路
这是本蒟蒻博客的第一篇文章,不规范之处敬请各位大佬指正和谅解orz Loj#6223+Luogu P4009 文章目录 前言 一.建模 二.代码实现 1.节点在图中的编号(分层图的存储) 2.建边 对 ...
- HDU 5669 Road(线段树建树)(分层图最短路)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5669 [分析]线段树建树+分层图最短路 #include <cstdio> #includ ...
最新文章
- LeetCode 239. Sliding Window Maximum
- jzoj4012-Distinct Paths【搜索】
- 麻省理工、微软为AI量身打造了一套leetcode编程题
- bandizip专业版
- mysql limit分页查询效率
- 商汤科技20篇论文入选ICCV 2017,披露最新研究主线
- 数字信号处理《数字滤波器的MATLAB与FPGA实现》
- 计算机无法安装64位操作系统,彻底根除“无法安装64位版本的Office,因为在您的PC上找到了以下32位程序:”的问题-网络教程与技术
-亦是美网络...
- import torch报错画图问题Matplotlib created a temporary config/cache directory at /tmp/matplotl
- Vuforia入门之简单图片识别案例(一)
- imx6上调用 vpu
- 讲解后台管理系统之列表设计分享
- 【Java用法】@NotEmpty、@NotBlank、@NotNull注解的使用方法与区别
- 核心单词 Word List 1
- OpenWrt之配置无线中继(基于新三mt7621)
- Python | 分析txt文档特定词汇的词频,以《天龙八部》为例
- 轻松搞定表白女朋友:Android版APP (零基础也可直接下载软件)
- 爬虫day05 动态网站爬取,json模块 selenium , phantomjs , BeautifulSoup
- 在网页中显示高亮的代码块
- 超详细!关于万能头文件<bits/stdc++.h>的细节