383. 观光(dp思想运用,Dijkstra)

383. 观光 - AcWing题库

“您的个人假期”旅行社组织了一次比荷卢经济联盟的巴士之旅。

比荷卢经济联盟有很多公交线路。

每天公共汽车都会从一座城市开往另一座城市。

沿途汽车可能会在一些城市(零或更多)停靠。

旅行社计划旅途从 S 城市出发,到 F 城市结束。

由于不同旅客的景点偏好不同,所以为了迎合更多旅客,旅行社将为客户提供多种不同线路。

游客可以选择的行进路线有所限制,要么满足所选路线总路程为 S 到 F 的最小路程,要么满足所选路线总路程仅比最小路程多一个单位长度。

3463_1.png

如上图所示,如果 S=1,F=5,则这里有两条最短路线 1→2→5,1→3→5,长度为 6;有一条比最短路程多一个单位长度的路线 1→3→4→5,长度为 7。

现在给定比荷卢经济联盟的公交路线图以及两个城市 S 和 F,请你求出旅行社最多可以为旅客提供多少种不同的满足限制条件的线路。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。

每组数据第一行包含两个整数 N 和 M,分别表示总城市数量和道路数量。

接下来 M 行,每行包含三个整数 A,B,L,表示有一条线路从城市 A 通往城市 B,长度为 L。

需注意,线路是 单向的,存在从 A 到 B 的线路不代表一定存在从 B 到 A 的线路,另外从城市 A 到城市 B 可能存在多个不同的线路。

接下来一行,包含两个整数 S 和 F,数据保证 S 和 F 不同,并且 S、F 之间至少存在一条线路。

输出格式

每组数据输出一个结果,每个结果占一行。

数据保证结果不超过 109。

数据范围

2≤N≤1000,
1≤M≤10000,
1≤L≤1000,
1≤A,B,S,F≤N

输入样例:
2
5 8
1 2 3
1 3 2
1 4 5
2 3 1
2 5 3
3 4 2
3 5 4
4 5 3
1 5
5 6
2 3 1
3 2 1
3 1 10
4 5 2
5 2 7
5 2 7
4 1
输出样例:
3
2

解析:

最短路径的条数。

如果存在比最短路径长度恰好多1的路径,则再把这样的路径条数加上。

状态划分:不重不漏,将状态转移所依据的状态体现出来;

d[i,0]表示从1到i的最短路径距离,cnt[i,0]最短路径条数

d[i,1]表示从1到i的次短路径距离,cnt[i,1]次短路径条数

这里还是和之前的题目一样,将d[i,0]和d[i,1]两种状态看成两个点。

重点解决:d[i,1]表示从1到i的次短路径,具体看代码处理。

本题很好,非常值得回味!

#include<iostream>
#include<string>
#include<cstring>
#include<cmath>
#include<ctime>
#include<algorithm>
#include<utility>
#include<stack>
#include<queue>
#include<vector>
#include<set>
#include<math.h>
#include<map>
#include<sstream>
#include<deque>
#include<unordered_map>
using namespace std;
const int N = 1e3 + 5, M = 1e4 + 5;
struct Ver {
	int ver, type, dist;
	bool operator > (const Ver& W) const {
		return dist > W.dist;
	}
};
int n, m, S, T;
int h[N], e[M], w[M], ne[M], idx;
int dist[N][2], cnt[N][2];
int vis[N][2];

void add(int a, int b, int c) {
	e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx++;
}

int Dijkstra() {
	memset(dist, 0x3f, sizeof dist);
	memset(cnt, 0, sizeof cnt);
	priority_queue<Ver, vector<Ver>, greater<Ver>>heap;
	dist[S][0] = 0, cnt[S][0] = 1;
	heap.push({ S,0,0 });
	while (!heap.empty()) {
		Ver t = heap.top();
		heap.pop();
		int ver = t.ver, type = t.type, d = t.dist, count = cnt[ver][type];
		if (vis[ver][type])continue;
		vis[ver][type] = 1;

		//cout << "__________________________________" << ver << endl;

		for (int i = h[ver]; i != -1; i = ne[i]) {
			int j = e[i];
			
			//cout << "++++++++++++++++++" << j << endl;

			if (dist[j][0] > d + w[i]) {
				dist[j][1] = dist[j][0];
				cnt[j][1] = cnt[j][0];
				heap.push({ j,1,dist[j][1] });
				dist[j][0] = d + w[i];
				cnt[j][0] = count;
				heap.push({ j,0,dist[j][0] });
			}
			else if (dist[j][0] == d + w[i]) {
				cnt[j][0] += count;
			}
			else if (dist[j][1] > d + w[i]) {
				dist[j][1] = d + w[i];
				cnt[j][1] = count;
				heap.push({ j,1,dist[j][1] });
			}
			else if(dist[j][1] == d + w[i]) {
				cnt[j][1] += count;
			}
		}
	}
	int ret = cnt[T][0];
	if (dist[T][1] == dist[T][0] + 1)ret += cnt[T][1];
	return ret;
}

int main() {
	int TT;
	cin >> TT;
	while (TT--) {
		memset(h, -1, sizeof h);
		memset(vis, 0, sizeof vis);
		idx = 0;
		scanf("%d%d", &n, &m);
		for (int i = 1, a, b, c; i <= m; i++) {
			scanf("%d%d%d", &a, &b,&c);
			add(a, b, c);
		}
		scanf("%d%d", &S, &T);
		printf("%d\n", Dijkstra());
		/*cout << endl << endl;
		for (int i = 1; i <= n; i++) {
			cout << dist[i][0] << " ";
		}
		cout << endl;
		for (int i = 1; i <= n; i++) {
			cout << cnt[i][0] << " ";
		}
		cout << endl<<endl;
		for (int i = 1; i <= n; i++) {
			cout << dist[i][1] << " ";
		}
		cout << endl;
		for (int i = 1; i <= n; i++) {
			cout << cnt[i][1] << " ";
		}
		cout << endl;*/
	}
	return 0;
}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/329679.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

1.C语言基础知识

这里写目录标题 1.第一个C语言程序2.注释3.标识符4.关键字5.数据类型6.变量7.常量8.运算符9.输入输出输入输出 1.第一个C语言程序 C语言的编程框架 #include <stdio.h> int main() {/* 我的第一个 C 程序 */printf("Hello, World! \n");return 0; }2.注释 单行…

信管网2023年上半年信息系统项目管理师论文真题

链接 信息系统项目管理师真题题库 - 信管网 上午综合知识、下午案例分析和下午论文三部分 可以单个试题查看 可以在线考试 在线考试又分&#xff1a;考试模式、练习模式和机考模式

黑马程序员JavaWeb开发|案例:tlias智能学习辅助系统(6)解散部门

指路&#xff08;1&#xff09;&#xff08;2&#xff09;&#xff08;3&#xff09;&#xff08;4&#xff09;&#xff08;5&#xff09;&#x1f447; 黑马程序员JavaWeb开发|案例&#xff1a;tlias智能学习辅助系统&#xff08;1&#xff09;准备工作、部门管理_tlias智能…

【Qt】Qt配置

需要云服务器等云产品来学习Linux的同学可以移步/-->腾讯云<--/-->阿里云<--/-->华为云<--/官网&#xff0c;轻量型云服务器低至112元/年&#xff0c;新用户首次下单享超低折扣。 目录 一、Qt SDK下载 二、配置环境变量 三、新建工程(QWidget) 四、QWidg…

今年第一个互联网医疗IPO,健康之路靠医药零售“再上一层楼”?

提起互联网医疗&#xff0c;大家最先想到的或许是阿里健康、京东健康、丁香医生等“名号响亮”的公司。事实上&#xff0c;健康之路开辟互联网医疗之路的时间比这些巨头们更早。据悉&#xff0c;2001年&#xff0c;健康之路就将互联网和医院资源结合&#xff0c;是第一批开展线…

Halcon基于灰度值的模板匹配

Halcon基于灰度值的模板匹配 基于灰度值的模板匹配是最经典的模板匹配算法&#xff0c;也是最早提出来的模板匹配算法。这种算法的根本思想是&#xff0c;计算模板图像与检测图像之间的像素灰度差值的绝对值总和&#xff08;SAD方法&#xff09;或者平方差总和&#xff08;SSD…

【C语言基础考研向】04整型进制转换

整型常量的不同进制表示 计算机中只能存储二进制数&#xff0c;即0和1&#xff0c;(而在对应的物理硬件上则是高、低电平。为了更方便地观察内存中的二进制数情况&#xff0c;除我们正常使用的十进制数外&#xff0c;计算机还提供了十六进制数和八进制数。 下面介绍不同进制数的…

【从0上手cornerstone3D】如何加载nifti格式的文件

在线演示 支持加载的文件格式 .nii .nii.gz 代码实现 npm install cornerstonejs/nifti-volume-loader// ------------- 核心代码 Start------------------- // 注册一个nifti格式的加载器 volumeLoader.registerVolumeLoader("nifti",cornerstoneNiftiImageVolu…

集合框架(二)

List集合 特点、特有方法 List集合因为支持索引&#xff0c;所以多了很多于索引相关的方法&#xff0c;当然&#xff0c;Collection的功能List也都继承了。 方法名称说明void add&#xff08;int index&#xff0c;E element&#xff09;在此集合中的指定位置插入指定的元素…

HTML---Jquery选择器

文章目录 目录 文章目录 本章目标 一.Jquery选择器概述 二.Jquery选择器分类 基本选择器 层次选择器 属性选择器 三.基本过滤选择器 练习 本章目标 会使用基本选择器获取元素会使用层次选择器获取元素会使用属性选择器获取元素会使用过滤选择器获取元素 …

[足式机器人]Part2 Dr. CAN学习笔记-Advanced控制理论 Ch04-16 Robust Controller非线性鲁棒控制器

本文仅供学习使用 本文参考&#xff1a; B站&#xff1a;DR_CAN Dr. CAN学习笔记-Advanced控制理论 Ch04-16 Robust Controller非线性鲁棒控制器 1. Slide Control 滑膜控制2 High Gain High Frequency3. 三种鲁棒控制器的比较如何分析控制器 Robust Control : tp achieve rob…

云服务器基于Centos创建个人云盘实践经验分享

文章目录 安装运行Cloudreve安装ossfscentos更换yum源 配置ossfs挂载oss存储配置开机启动 配置cloudreve推荐阅读 安装运行Cloudreve 执行如下命令&#xff0c;下载cloudreve安装包。 wget https://labfileapp.oss-cn-hangzhou.aliyuncs.com/cloudreve_3.3.1_linux_amd64.tar…

QT5构建套件检测不到MSVC2017解决方法

文章目录 前言一、本地环境二、现象三、解决办法 前言 记录一下 QT5 构建套件检测不到 MSVC2017 解决方法 。Qt Creator MSVC开发环境搭建&#xff08;Qt Creator 集成工具 MSVC编译&#xff09; 一、本地环境 电脑操作系统&#xff1a;Win11Qt 版本&#xff1a;Qt 5.14.2 …

七陌API对接实战:外呼接口及通话记录推送

通过白码低代码开发平台对接七陌外呼接口&#xff0c;实现选择客户进行外呼&#xff0c;并保存通话记录的功能。 外呼接口实现&#xff1a; 官方接口文档&#xff1a;http://developer.7moor.com/v2docs/dialout/ 1、对接数据查询 向七陌商务索取到七陌用户中心账号密码&a…

【C语言】详解编译和链接

1.翻译环境和运行环境 在ANSIC的任何一种实现中&#xff0c;存在两个不同的环境 第1种是翻译环境&#xff0c;在这个环境中源代码被转换为可执行的机器指令第2种是执行环境&#xff0c;它用于实际执行代码 2.翻译环境 翻译环境是怎么将源代码转换为可执行的机器指令的呢&…

openssl3.2 - 官方demo学习 - guide - tls-client-block.c

文章目录 openssl3.2 - 官方demo学习 - guide - tls-client-block.c概述记录问题server和client IP都为localhostserver和client IP都为127.0.0.1想到解决问题的方法1想到解决问题的方法2笔记END openssl3.2 - 官方demo学习 - guide - tls-client-block.c 概述 tls 客户端 官…

厨卫产品画册的制作全攻略

厨卫产品画册的制作是一项复杂而又重要的任务&#xff0c;它不仅关乎产品的展示&#xff0c;更关乎品牌形象的塑造。一个好的厨卫产品画册能够吸引潜在客户的注意力&#xff0c;提升品牌知名度&#xff0c;同时也能为销售团队提供有力的销售工具。 一、明确目标与定位 在制作厨…

记一次手动查杀Linux服务器挖矿木马

目录 前言排查开始系统占用进程排查网络统计 深入排查修复指令篡改隐藏程序查找进程信息查看 后续清理删除相关文件systemd计划任务用户 原因追溯 前言 我实验室的座位隔壁放着一台其他课题组管理的服务器&#xff0c;平时利用率不高。那天我发现服务器的风扇转速拉满持续了至…

test-02-test case generate 测试用例生成 EvoSuite 介绍

拓展阅读 junit5 系列 基于 junit5 实现 junitperf 源码分析 Auto generate mock data for java test.(便于 Java 测试自动生成对象信息) Junit performance rely on junit5 and jdk8.(java 性能测试框架。性能测试。压测。测试报告生成。) 拓展阅读 自动生成测试用例 什么…

企业网络扫描程序中需要的功能

网络扫描程序已成为每个 IT 管理员抵御安全漏洞的第一道防线不可或缺的一部分。使用正确的网络扫描程序工具进行有效的网络侦察和诊断&#xff0c;使管理员能够查明可能升级为安全风险和网络事故的网络问题。典型的网络扫描程序可以与 IP 扫描程序配合使用&#xff0c;按顺序扫…