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;
}
 

posted on   itdef  阅读(6)  评论(0编辑  收藏  举报

相关博文:
阅读排行:
· 阿里最新开源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 教程前两章节学习

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

统计

点击右上角即可分享
微信分享提示