洛谷 P4568 [JLOI2011]飞行路线 解题报告
P4568 [JLOI2011]飞行路线
题目描述
Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司。该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为0到\(n−1\) ,一共有\(m\)种航线,每种航线连接两个城市,并且航线有一定的价格。
Alice和Bob现在要从一个城市沿着航线到达另一个城市,途中可以进行转机。航空公司对他们这次旅行也推出优惠,他们可以免费在最多\(k\)种航线上搭乘飞机。那么Alice和Bob这次出行最少花费多少?
输入输出格式
输入格式:
数据的第一行有三个整数,\(n,m,k\),分别表示城市数,航线数和免费乘坐次数。
第二行有两个整数,\(s,t\),分别表示他们出行的起点城市编号和终点城市编号。
接下来有\(m\)行,每行三个整数, \(a,b,c\),表示存在一种航线,能从城市\(a\)到达城市\(b\),或从城市\(b\)到达城市\(a\),价格为\(c\)。
输出格式:
只有一行,包含一个整数,为最少花费。
这是一个分层图+最短路的题目
一种做法是按深度建图+向更深的图连0边,但这里讨论类似于DP的一种思想。
令\(dis[i][j]\)代表节点\(i\)在深度为\(j\)的时候的最短路。
按找dijk的思想进行三角形不等式松弛即可
据说这个题卡SPFA
实现看代码吧,我感觉挺好理解的。
#include <cstdio>
#include <cstring>
#include <queue>
using namespace std;
const int N=10010;
const int M=50010;
int head[N],cnt=0,to[M<<1],next[M<<1],edge[M<<1];
void add(int u,int v,int w)
{
    to[++cnt]=v;next[cnt]=head[u];edge[cnt]=w;head[u]=cnt;
}
struct node
{
    int i,dep,w;
    bool friend operator <(node n1,node n2)
    {
        return n1.w>n2.w;
    }
    node(){}
    node(int i,int dep,int w)
    {
        this->i=i;
        this->dep=dep;
        this->w=w;
    }
};
priority_queue <node> q;
int dis[N][12],used[N][12],n,m,k,s,t;
void dijk()
{
    memset(dis,0x3f,sizeof(dis));
    dis[s][0]=0;
    node tt(s,0,dis[s][0]);
    q.push(tt);
    while(!q.empty())
    {
        node from=q.top();
        q.pop();
        int dep=from.dep,u=from.i;
        if(used[u][dep]) continue;
        used[u][dep]=1;
        for(int i=head[u];i;i=next[i])
        {
            int v=to[i],w=edge[i];
            if(!used[v][dep]&&dis[v][dep]>dis[u][dep]+w)
            {
                dis[v][dep]=dis[u][dep]+w;
                node tt(v,dep,dis[v][dep]);
                q.push(tt);
            }
            if(dep<k&&!used[v][dep+1]&&dis[v][dep+1]>dis[u][dep])
            {
                dis[v][dep+1]=dis[u][dep];
                node tt(v,dep+1,dis[v][dep+1]);
                q.push(tt);
            }
        }
    }
}
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&k,&s,&t);
    int u,v,w;
    for(int i=1;i<=m;i++)
    {
        scanf("%d%d%d",&u,&v,&w);
        add(u,v,w),add(v,u,w);
    }
    dijk();
    printf("%d\n",dis[t][k]);
    return 0;
}
2018.6.20
洛谷 P4568 [JLOI2011]飞行路线 解题报告的更多相关文章
- 洛谷 P4568 [JLOI2011]飞行路线 题解
		
P4568 [JLOI2011]飞行路线 题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在\(n\)个城市设有业务,设这些城市分别标记为\(0\)到\( ...
 - 洛谷 P4568 [JLOI2011]飞行路线
		
题目描述 Alice和Bob现在要乘飞机旅行,他们选择了一家相对便宜的航空公司.该航空公司一共在n个城市设有业务,设这些城市分别标记为0到n-1,一共有m种航线,每种航线连接两个城市,并且航线有一定的 ...
 - [洛谷P4568][JLOI2011]飞行路线
		
题目大意:最短路,可以有$k$条边无费用 题解:分层图最短路,建成$k$层,层与层之间的边费用为$0$ 卡点:空间计算出错,建边写错 C++ Code: #include <cstdio> ...
 - 洛谷 P1783 海滩防御 解题报告
		
P1783 海滩防御 题目描述 WLP同学最近迷上了一款网络联机对战游戏(终于知道为毛JOHNKRAM每天刷洛谷效率那么低了),但是他却为了这个游戏很苦恼,因为他在海边的造船厂和仓库总是被敌方派人偷袭 ...
 - 洛谷 P4597 序列sequence 解题报告
		
P4597 序列sequence 题目背景 原题\(\tt{cf13c}\)数据加强版 题目描述 给定一个序列,每次操作可以把某个数\(+1\)或\(-1\).要求把序列变成非降数列.而且要求修改后的 ...
 - 洛谷1087 FBI树 解题报告
		
洛谷1087 FBI树 本题地址:http://www.luogu.org/problem/show?pid=1087 题目描述 我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全 ...
 - 洛谷 P3349 [ZJOI2016]小星星 解题报告
		
P3349 [ZJOI2016]小星星 题目描述 小\(Y\)是一个心灵手巧的女孩子,她喜欢手工制作一些小饰品.她有\(n\)颗小星星,用\(m\)条彩色的细线串了起来,每条细线连着两颗小星星. 有一 ...
 - 洛谷 P3177 树上染色 解题报告
		
P3177 [HAOI2015]树上染色 题目描述 有一棵点数为\(N\)的树,树边有边权.给你一个在\(0\) ~ \(N\)之内的正整数\(K\),你要在这棵树中选择\(K\)个点,将其染成黑色, ...
 - 洛谷 P4705 玩游戏 解题报告
		
P4705 玩游戏 题意:给长为\(n\)的\(\{a_i\}\)和长为\(m\)的\(\{b_i\}\),设 \[ f(x)=\sum_{k\ge 0}\sum_{i=1}^n\sum_{j=1}^ ...
 
随机推荐
- 20155320 Exp7 网络欺诈防范
			
20155320 Exp7 网络欺诈防范 [基础问题回答] (1)通常在什么场景下容易受到DNS spoof攻击 乱点链接或者连公共场合的免费WiFi也容易受到攻击,尤其是那种不需要输入密码直接就可以 ...
 - SpingMVC的<context:component-scan>包扫描踩坑记录
			
公司项目配置的Spring项目的包扫描有点问题,出现了一个被Spring容器管理的Bean被创建了2次的现象.在此记录下解决的过程,方便后续查阅. 改动前: 容器启动监听器中会扫描全部包,创建 ...
 - Hadoop日记Day5---HDFS介绍
			
一.HDFS介绍 1.1 背景 随着数据量越来越大,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式 ...
 - 让Visual Studio载入Symbol(pdb)文件
			
让Visual Studio载入Symbol(pdb)文件 让Visual Studio载入Symbol(pdb)文件 在VC编译工程的编译连接阶段,会产生Symbol文件,也就是常说的 pdb 文件 ...
 - PowerBI开发 第八篇:查询参数
			
在PowerBI Desktop中,用户可以定义一个或多个查询参数(Query Parameter),参数的功能是为了实现PowerBI的参数化编程,使得Data Source的属性.替换值和过滤数据 ...
 - Jenkins下载安装
			
Jenkins是什么? Jenkins是一个功能强大的应用程序,允许持续集成和持续交付项目,无论用的是什么平台.这是一个免费的源代码,可以处理任何类型的构建或持续集成.集成Jenkins可以用于一些测 ...
 - React笔记-事件分发
			
事件分发 之前讲述了事件如何绑定在document上,那么具体事件触发的时候是如何分发到具体的监听者呢?我们接着上次注册的事件代理看.当我点击update counter按钮时,触发注册的click事 ...
 - twig用法
			
1. GyAdminBundle::base.html.twig 必须添加Bundle名才可引用模板
 - 1079. Total Sales of Supply Chain (25)-求数的层次和叶子节点
			
和下面是同类型的题目,只不过问的不一样罢了: 1090. Highest Price in Supply Chain (25)-dfs求层数 1106. Lowest Price in Supply ...
 - spring boot 添加整合ssl使得http变成https方法
			
1. https出现的背景:(1)都知道http传输协议是裸漏的,明文传输的,极易被黑客拦截,因此,(2)人们想出的使用加密,也就是 对称加密 例如aes,不过这个由于因为对称加密需要每个客户端和服务 ...