牛客练习赛47 D DongDong坐飞机 (分层最短路)
链接: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坐飞机 (分层最短路)的更多相关文章
- 牛客练习赛47 E DongDong数颜色 (树状数组维护区间元素种类数)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 牛客练习赛47 E DongDong数颜色 (树上启发式合并)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 牛客练习赛47 A DongDong破密码 (异或性质,递推)
链接:https://ac.nowcoder.com/acm/contest/904/A 来源:牛客网 DongDong破密码 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1310 ...
- 牛客练习赛47 DongDong数颜色 (莫队算法)
链接:https://ac.nowcoder.com/acm/contest/904/E 来源:牛客网 DongDong数颜色 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 5242 ...
- 【并查集缩点+tarjan无向图求桥】Where are you @牛客练习赛32 D
目录 [并查集缩点+tarjan无向图求桥]Where are you @牛客练习赛32 D PROBLEM SOLUTION CODE [并查集缩点+tarjan无向图求桥]Where are yo ...
- 牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 逻辑,博弈 B
牛客练习赛31 B 赞迪卡之声妮莎与奥札奇 https://ac.nowcoder.com/acm/contest/218/B 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 2621 ...
- 牛客练习赛31 D 神器大师泰兹瑞与威穆 STL,模拟 A
牛客练习赛31 D 神器大师泰兹瑞与威穆 https://ac.nowcoder.com/acm/contest/218/D 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 26214 ...
- 最小生成树--牛客练习赛43-C
牛客练习赛43-C 链接: https://ac.nowcoder.com/acm/contest/548/C 来源:牛客网 题目描述 立华奏是一个刚刚开始学习 OI 的萌新. 最近,实力强大的 ...
- 牛客练习赛28-B(线段树,区间更新)
牛客练习赛28 - B 传送门 题目 qn姐姐最好了~ qn姐姐给你了一个长度为n的序列还有m次操作让你玩, 1 l r 询问区间[l,r]内的元素和 2 l r 询问区间[l,r]内的 ...
随机推荐
- 如何从项目中移除CocoaPods
一.项目Show in Finder: 删除本地文件(Podfile.Podfile.lock.Pods文件夹) 删除本地生成的xcworkspace文件 打开项目,在Frameworks文件夹下,删 ...
- C基础知识(9):输入输出、文件读写
输入输出 (1) getchar() & putchar() 函数: 读写字符. (2) scanf() 和 printf() 函数:根据提供的format来转换输入为其他数据类型,并根据提供 ...
- CDC类介绍
CDC类 中文介绍 CDC类定义的是设备上下文对象的类. CDC对象提供处理显示器或打印机等设备上下文的成员函数,以及处理与窗口客户区对应的显示上下文的成员. 通过CDC对象的成员函数进行所有的绘图. ...
- 微信小程序省市区联动,自定义地区字典
最近在做一个项目的时候遇到了这么一个问题,就是省市区的联动呢,我们需要自定义字典来设置,那么微信小程序自带的省市区选择就不能用了,经过三根烟的催化,终于写出来了.下面献上代码示例. 首先是在utils ...
- TCP/IP中32位IP地址与字符串转化
转载:http://www.cnitblog.com/wujian-IT/archive/2007/10/11/34739.aspx 在网络上面我们用的IP都是数字加点(192.168.0.1)构成的 ...
- Emgu 学习笔记(8)之膨胀腐蚀
static void Main(String[] args) { Mat img = CvInvoke.Imread(); Mat d = new Mat(); Mat e = new Mat(); ...
- [转帖]docker-compose
docker-compose https://www.cnblogs.com/embedded-linux/p/10714179.html 需要学习使用一下. 改天自己再改改用过的yaml文件. ...
- 【转帖】GBase 数据库
产品介绍 分析型数据管理系统 GBase 8a GBase 8a能够实现大数据的全数据(结构化数据.半结构化数据和非结构化数据)存储管理和高效分析,为行业大数据应用提供完整的数据库解决方案.GBase ...
- Linx
1. 2. 2. 3. 5. Vi 猜数字 第二十个裴伯拉数字 1 1 2 3 5 8 2 3 求小于3000的裴伯拉数列 4 5 递归方式1到100 和 6 7 100 以内奇数.偶数和 8 Sss ...
- HDU - 1711 A - Number Sequence(kmp
HDU - 1711 A - Number Sequence Given two sequences of numbers : a[1], a[2], ...... , a[N], and b[1 ...