303 小蜗的旅行
// 303 小蜗的旅行.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//
/*
http://oj.daimayuan.top/course/14/problem/657
小蜗想要完成一次说走就走的旅行,他来到了某旅行社进行咨询。
地图可以看做是一张 n个顶点 m条边的无向简单图,顶点编号从 1到 n
,每个顶点表示一座城市,在两个城市之间移动需要花费连接这两座城市的边的边权的代价。
小蜗是这家旅行社的vip用户,他拥有 k张打折券,在一次移动中他可以使用一张打折券,
使得这次移动的代价变成之前的一半,每条边只能使用一张打折券。
小蜗现在在 1号城市,他想知道他最少需要花费多少代价可以到达 n号城市,数据保证 1号城市和 n号城市两地连通。
输入格式
第一行三个整数 n,m,k
,表示图的顶点数(也就是城市数)、边数和打折券的数量。
接下来 m行,每行三个整数 x,y,z
,表示 x号城市和 y号城市之间有一条边权为 z的边。
输出格式
输出一行一个数表示答案。
样例输入
3 2 1
1 2 4
2 3 6
样例输出
7
数据规模
对于所有数据,保证 2≤n≤500,1≤m≤2000,1≤k≤10,1≤x,y≤n,1≤z≤10000,保证 z是偶数。
*/
#include <iostream>
#include <queue>
#include <cstring>
using namespace std;
const int N = 505, M = 40010;
int h[N], w[M], e[M], ne[M], idx; // 邻接表存储所有边
int dist[N][15]; // 存储每个点到1号点的最短距离
bool st[N][15]; // 存储每个点是否在队列中
int n, m, k;
void add(int a, int b, int c) {
e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}
void spfa() {
memset(dist, 0x3f, sizeof dist);
dist[1][0] = 0;
queue<pair<int,int>> q;
q.push({1,0});
st[1][0] = true;
while (q.size())
{
auto t = q.front();
q.pop();
int pnum = t.first; int usecnt = t.second;
st[pnum][usecnt] = false;
for (int i = h[pnum]; i != -1; i = ne[i]) {
int j = e[i];
if (usecnt<=k && dist[j][usecnt] > dist[pnum][usecnt] + w[i]) {
dist[j][usecnt] = dist[pnum][usecnt] + w[i];
if (!st[j][usecnt]) {
q.push({ j,usecnt});
st[j][usecnt] = true;
}
}
if (usecnt + 1 <= k && dist[j][usecnt + 1] > dist[pnum][usecnt] + w[i] / 2) {
dist[j][usecnt + 1] = dist[pnum][usecnt] + w[i] / 2;
if (!st[j][usecnt+1]) {
q.push({ j,usecnt+1 });
st[j][usecnt+1] = true;
}
}
}
}
int ans = 0x3f3f3f3f;
for (int i = 0; i <= k; i++) {
ans = min(ans, dist[n][i]);
}
cout << ans << endl;
}
int main()
{
memset(h, -1, sizeof h);
cin >> n >> m >> k;
for (int i = 1; i <= m; i++) {
int a, b, c; cin >> a >> b >> c;
add(a, b, c); add(b, a, c);
}
spfa();
return 0;
}
作 者: itdef
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力
欢迎转帖 请保持文本完整并注明出处
技术博客 http://www.cnblogs.com/itdef/
B站算法视频题解
https://space.bilibili.com/18508846
qq 151435887
gitee https://gitee.com/def/
欢迎c c++ 算法爱好者 windows驱动爱好者 服务器程序员沟通交流
如果觉得不错,欢迎点赞,你的鼓励就是我的动力


【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!
2019-08-15 acwing 50. 序列化二叉树
2017-08-15 随机发牌 代码
2017-08-15 网络传输 buf 封装 示例代码
2016-08-15 CMAKE 教程前两章节学习