链接:https://ac.nowcoder.com/acm/contest/904/D

来源:牛客网

DongDong坐飞机

时间限制:C/C++ 1秒,其他语言2秒

空间限制:C/C++ 524288K,其他语言1048576K

64bit IO Format: %lld

题目描述

愿时间过得慢一些,让我记住他的一颦一笑——DongDong

DongDong家的萨摩耶去国外读书了,DongDong非常想他,决定假期坐飞机去看望他,DongDong想合理使用手上的飞机折扣让自己不要吃土。给定n个城市,m条飞机航线,k次半价机会,1为DongDong家,n为萨摩耶家,每条单向边都有起点终点和机票价格(保证所有价格大于0),她可以k次使用半价折扣,求从1到n的最小花费。(若无法从1到n,输出-1)

输入描述:

第一行三个整数,n,m,k

接下来m行每行,u,v,w,表示存在u到v的边,代价为w(保证所有w均为偶数)

n<=10000,m<=50000,k<=10,0<=w<=1000000(w为偶数),数据可能有重边和自环

输出描述:

第一行输出最小花费

示例1

输入

复制

3 5 2

1 2 2

2 3 100

1 3 100

3 2 1010

1 3 1010

输出

复制

50

思路:

分层最短路的题目,可以定义二维数组dis[i][j] 表示1到第i节点,用了j次半价优惠,最短距离是多少?

容易知道 如果有一条边u指向v, 那么 dis[v][j] 可以由 dis[u][j] 和 dis[u][j-1] 转移过来。

在dijkstra的过程中维护dis[i][j] 即可。

理论复杂度O(nk log nk)

细节见代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <vector>
#include <iomanip>
#define ALL(x) (x).begin(), (x).end()
#define sz(a) int(a.size())
#define all(a) a.begin(), a.end()
#define rep(i,x,n) for(int i=x;i<n;i++)
#define repd(i,x,n) for(int i=x;i<=n;i++)
#define pii pair<int,int>
#define pll pair<long long ,long long>
#define gbtb ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
#define MS0(X) memset((X), 0, sizeof((X)))
#define MSC0(X) memset((X), '\0', sizeof((X)))
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define eps 1e-6
#define gg(x) getInt(&x)
#define chu(x) cout<<"["<<#x<<" "<<(x)<<"]"<<endl
using namespace std;
typedef long long ll;
ll gcd(ll a, ll b) {return b ? gcd(b, a % b) : a;}
ll lcm(ll a, ll b) {return a / gcd(a, b) * b;}
ll powmod(ll a, ll b, ll MOD) {ll ans = 1; while (b) {if (b % 2)ans = ans * a % MOD; a = a * a % MOD; b /= 2;} return ans;}
inline void getInt(int* p);
const int maxn = 10010;
const ll inf = 1e18;
/*** TEMPLATE CODE * * STARTS HERE ***/
struct node
{
int to;
int kk;
ll val;
node(){}
node(int tt,int ww,ll vv)
{
kk=ww;
to=tt;
val=vv;
}
bool operator < (const node & b) const
{
return val>b.val;
}
};
std::vector<node> e[maxn];
ll dis[maxn][15];
void addedge(int a,int b,ll v)
{
e[a].push_back(node(b,0,v));
}
void init(int n)
{
for(int i=1;i<=n;++i)
{
for(int j=0;j<=14;j++)
dis[i][j]=inf;
}
}
priority_queue<node> heap;
int n;
int m,k;
void dijkstra(int strat)
{
init(n);
dis[strat][0]=0ll;
heap.push(node(strat,0,0ll));
node temp;
while(!heap.empty())
{
temp=heap.top();
heap.pop();
int now=temp.to;
ll val=temp.val;
int kk=temp.kk;
if(kk>k)
{
continue;
}
if(val>dis[now][kk])
continue;
for(auto x:e[now])
{
if(dis[x.to][kk]>val+x.val)
{
dis[x.to][kk]=val+x.val;
heap.push(node(x.to,kk,dis[x.to][temp.kk]));
}
if(kk<k&&dis[x.to][temp.kk+1]>val+x.val/2)
{
dis[x.to][kk+1]=val+x.val/2;
heap.push(node(x.to,kk+1,dis[x.to][temp.kk+1]));
} }
}
}
int main()
{
//freopen("D:\\code\\text\\input.txt","r",stdin);
//freopen("D:\\code\\text\\output.txt","w",stdout);
gbtb;
cin>>n>>m>>k;
int u,v;ll c;
while(m--)
{
cin>>u>>v>>c;
addedge(u,v,c);
}
dijkstra(1);
ll ans=inf;
repd(i,0,k)
{
ans=min(ans,dis[n][i]);
// printf("%lld ",dis[n][i] );
}
if(ans==inf)
ans=-1;
cout<<ans<<endl;
return 0;
} inline void getInt(int* p) {
char ch;
do {
ch = getchar();
} while (ch == ' ' || ch == '\n');
if (ch == '-') {
*p = -(getchar() - '0');
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 - ch + '0';
}
}
else {
*p = ch - '0';
while ((ch = getchar()) >= '0' && ch <= '9') {
*p = *p * 10 + ch - '0';
}
}
}

牛客练习赛47 D DongDong坐飞机 (分层最短路)的更多相关文章

  1. 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  2. 牛客练习赛47 E DongDong数颜色 (树上启发式合并)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  3. 牛客练习赛47 A DongDong破密码 (异或性质,递推)

    链接:https://ac.nowcoder.com/acm/contest/904/A 来源:牛客网 DongDong破密码 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1310 ...

  4. 牛客练习赛47 DongDong数颜色 (莫队算法)

    链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...

  5. 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D

    目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...

  6. 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B

    牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...

  7. 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A

    牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...

  8. 最小生成树--牛客练习赛43-C

    牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 ​ 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...

  9. 牛客练习赛28-B(线段树,区间更新)

    牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ ​ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, ​ 1 l r 询问区间[l,r]内的元素和 ​ 2 l r 询问区间[l,r]内的 ...

随机推荐

  1. 工具类 分页工具类PageParamBean

    自己编写的分页工具类,根据不同的数据库类型,生成对应的分页sql信息,分享给大家,希望大家共勉,工具类有些地方,大家可能不需要,请根绝自己的需要进行修改使用,核心逻辑都在,如果大家觉得有什么不妥,欢迎 ...

  2. ELK 日志平台构建

    elastic中文社区 https://elasticsearch.cn/ 完整参考 ELK实时日志分析平台环境部署--完整记录 https://www.cnblogs.com/kevingrace/ ...

  3. [iOS]UIWebView返回和NSURLErrorDomain-999

    1.UIWebView实现返回不崩溃: -(BOOL)webView:(UIWebView *)webView shouldStartLoadWithRequest:(NSURLRequest *)r ...

  4. ansible使用sudo

    方式一. 1.配置资源清单inventory文件 [root@test1 ~]# cat >/etc/ansible/hosts <<EOF [k8s] 192.168.0.92 a ...

  5. 小程序报错:出现脚本错误或者未正确调用 Page()的解决办法

    场景是两个人共同开发小程序,我使用的是pc端,另一个同事是用的mac端,我这边能够正常运行项目,代码提交到git,同事check下来发现运行报错: 出现脚本错误或者未正确调用 Page(); 如图 一 ...

  6. PTA --- 天梯赛 L1-028 判断素数

    L1-028 判断素数 (10 point(s))   本题的目标很简单,就是判断一个给定的正整数是否素数. 输入格式: 输入在第一行给出一个正整数N(≤ 10),随后N行,每行给出一个小于2​31​ ...

  7. Nginx动态添加模块 平滑升级

    已经安装好的Nginx动态添加模块 说明: 已经安装好的Nginx,需要添加一个未被编译安装的模块,需要怎么弄呢? 这里已安装第三方nginx-rtmp-module模块为例 nginx的模块是需要重 ...

  8. 【神经网络与深度学习】ZLIB介绍

    zlib类库提供了很多种压缩和解压缩的方式,由于时间的关系我只学习一下内容,以下是我在实现web 服务器压缩数据网页中使用到一些函数和常用数据结构.常量等. zlib使用过程 压缩过程:deflate ...

  9. mysql --single-transaction 在从库导入完数据以后要在配置文件/etc/my.cnf 中加上read_only=1的参数

    1.在做数据库的主从时,防止在这个过程中,有数据访问进来,要: 要想连super权限用户的写操作也禁止,就使用"flush tables with read lock;",这样设置 ...

  10. 获取JSON中所有的KEY

    采用递归的方式,遍历JSON中所有的KEY. JSON格式如下: {"username":"tom","age":18,"addr ...