L3-014 周游世界 (30 分)

2023-11-19

题目

题目链接

题解

DFS。


采用的数据结构,vector,索引为起点,值为{终点,起点公司编号},当然你也可以保存终点公司编号,但是代码中的语句就需要改一下了。

dfs,传入四个信息,当前节点、遇到的节点数、换乘数、当前节点所在公司的编号。

由于存在循环,要加入标记数组进行标记。


不敢dfs啊,而且也没想好用什么数据结构,看了大佬的题解才知道如何保存路径,才知道要用dfs,不过好歹最后自己写出来(算是)。

代码

#include<bits/stdc++.h>
#define PII pair <int, int>
using namespace std;

const int N = 1e5+10, INF = 0x3f3f3f3f;

struct node {
	int next, company;
};

int n, k, a, b, s, t;
int st[N], best_across = INF, best_change = INF;

vector <node> road[N];
vector <PII> path, best_path;


void dfs (int x, int across, int change, int company) { // x表示当前节点(编号) across表示经过的节点数量(含x) change表示换乘次数(含x) companny表示x所在公司编号(x可能存在于多个公司) 
	
	// 剪枝 
	if (across > best_across || (across == best_across && change > best_change))
		return ;
	
	if (x == t) {
		if (across < best_across || (across == best_across && change < best_change)) {
			best_across = across; // 更新最少经过的节点数 
			best_change = change; // 更新最 
			best_path = path; // 记录最佳路径 
		}
		return ;
	}
	
	for (int i = 0;i < road[x].size();i ++) {
		int next_road = road[x][i].next;
		int next_company = road[x][i].company;
		
		if (st[next_road]) continue; // 遇到过了就continue 

		st[next_road] = 1; // 防止循环 
		
		if (next_company == company) // 如果下一个节点所在公司与当前节点相同,则我们不记录输出路径 
			dfs (next_road, across+1, change, next_company); // 只加经过的节点数,不加换乘数 
		else {
			// 路径记录这里需要好好理解 
			path.push_back ({x, next_company}); // 将当前节点的所在公司改为与之相连的节点的公司编号,公司发生变更,记录换乘 
			dfs (next_road, across+1, change+1, next_company);
			path.pop_back (); // 回溯 
		}
		st[next_road] = 0;
	}
}

int main()
{
	cin >> n;
	for (int i = 1;i <= n;i ++) {
		cin >> k;
		cin >> a; // 先获取第一个节点 
		while (-- k) {
			cin >> b;
			road[a].push_back ({b, i}); // 加双向边 
			road[b].push_back ({a, i});
			a = b;
		}
	}
	cin >> k;
	while (k --) {
		cin >> s >> t;
		
		// 注意每次都需要初始化 
		memset (st, 0, sizeof st); 
		best_path.clear ();
		path.clear ();
		best_across = INF;
		best_change = INF;
		
		st[s] = 1; // 标记起点 
		dfs (s, 0, 0, 0); // 初始公司编号可以设置为不存在的一个值 
		if (!best_path.size()) puts ("Sorry, no line is available.");
		else {
			best_path.push_back ({t, 0}); // 保证输出终点,这样就不用单独输出从某个点到终点的信息了 
			cout << best_across << endl;
			for (int i = 0;i < best_path.size()-1;i ++)
				printf ("Go by the line of company #%d from %04d to %04d.\n", best_path[i].second, best_path[i].first, best_path[i+1].first);
		}
	}
	return 0;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

L3-014 周游世界 (30 分) 的相关文章

  • charles及弱网测试

    安装 安装完成后 charles gt help gt register 输入注册信息 Registered Name https zhile io License Key 48891cf209c6d32bf4 相关配置 1 安装根证书 h

随机推荐

  • 【华为OD机试】阿里巴巴找黄金宝箱(V)(C++ Python Java)2023 B卷

    时间限制 C C 1秒 其他语言 2秒 空间限制 C C 262144K 其他语言524288K 64bit IO Format lld 语言限定 C clang11 C clang 11 Pascal fpc 3 0 2 Java jav
  • 跨时钟域电路设计——结绳法

    信号从快时钟域到慢时钟域过渡时 慢时钟可能无法对快时钟变化太快的信号进行采样 之前的同步器法对两个时钟间的关系有要求 结绳法适用于任何时钟域之间的过渡 结绳法的原理是将快时钟信号的脉冲周期延长 等到慢时钟周期采样后再 解绳 还原为原来的脉冲
  • Java 基础系列(十六) --- Java中模板引擎的使用

    模板引擎 1 关于动态页面的渲染 2 非模板引擎的弊端 3 模板引擎 3 1 什么是模板引擎 3 2 Thymeleaf 语法 3 3 模板引擎的使用 4 总结 1 关于动态页面的渲染 渲染就是把数据和页面进行结合起来 主要分为服务器渲染和
  • Vue3 集成 UEditor puls 富文本编辑器

    一 前端配置 1 下载代码https gitee com modstart lib ueditor plus tree master 2 解压压缩包 如下图 3 拿到dist文件夹的内容 重命名为UEditor 并将其复制到vue项目的pu
  • 未找到esUtil_win32.c 您需要查找 esUtil_win32.c 以通过查看源来确定当前调用堆栈帧

    前言 在调试OPENGL ES 3 0编程指南 原书第2版 中文版 pdf 中第8章的例子报错 在调试时 发现 esUtil win32 c文件中的代码 如下 if esMain esContext GL TRUE return 1 这里r
  • 如何零基础自学c/c++语言?

    现在零基础学习C C 无非就两种方法 一种是自学还有 一种就是报班学习 关于报班学习在这里就不多说了 那么今天就说怎么从零基础开始自学C C 编程吧 先学习C语言入门 那么问题来了 怎么去学习C语言呢 一开始肯定是要看书 这里推荐的入门书籍
  • scipy.stats的用法——常见的分布和函数

    介绍python统计函数库scipy stats中常见的分布和函数 commom distributions uniform norm poisson bernoulli expon lognorm norm t chi2 f commom
  • mysql中geometry字段的查询和保存

    有段时间为了追求效率 把用es相关的地理位置功能都去掉了 使用mysql已有的geometry的功能做地理位置 mybatis这块 TableName value t event info autoResultMap true 如果使用复杂
  • python根据excel时间表统计24小时各小时区间点的个数

    1 首先使用excel中的HOUR 函数 将日期数据 年 月 日 时 分 秒 转换为小时 表格命名为hour xlsx 2 使用python读取excel数据hour xlsx 将小时列转换为列表hour 将列表hour转换为集合myset
  • Java词频统计算法(使用单词树)

    许多英语培训机构 如新东方 都会出几本 高频词汇 的书 主要内容是统计近几年来各类外语考试中屡次出现的高频词汇 帮助考生减少需要背的生词的数量 但这些高频是如何被统计出来的呢 显然不会用手工去计算 假如我们已经将一篇文章存在一字符串 Str
  • EditText的三种监听内容的方式

    editText addTextChangedListener object TextWatcher override fun onTextChanged s CharSequence start Int before Int count
  • 招聘数据采集+Hive数据分析+数据可视化

    1 需求 背景描述 近年来随着IT产业的快速发展 全国各地对IT 类的人才需求数量也在不断 增多 XHS集团 为了明确今后IT产业人才培养方向 在多个省份进行 IT公 司岗位情况调研分析 你所在的小组将承担模拟调研分析的任务 通过在招聘 网
  • 【Apifox Helper】自动生成接口文档,IDEA+Apifox懒人必备

    文章目录 前言 缘由 接口文档对接爽 整理起来真费脑 本文阅读时长 约10分钟 前置条件 1 IDEA开发工具 2 Apifox 不必要 主要目标 一秒生成接口文档 水图 IDEA中项目接结构图 生成到Apifox接口文档图 试用人群 1
  • PowerDesigner15.1如何安装?汉化破解版安装教程(含安装文件、汉化包、破解文件)

    powerdesigner是能进行数据库设计的强大的软件 是一款开发人员常用的数据库建模工具 使用它可以分别从概念数据模型 Conceptual Data Model 和物理数据模型 Physical Data Model 两个层次对数据库
  • glog详解

    glog详解 1 glog的安装与使用 1 下载glog http code google com p google glog downloads detail name glog 0 3 3 tar gz 2 安装glog configu
  • 请用详细列出宝塔搭建Nacos的流程

    好的 为了在宝塔中搭建 Nacos 服务 您需要执行以下步骤 下载 Nacos 的最新版本并解压缩 使用文本编辑器打开 conf application properties 文件 并修改其中的数据库配置 使 Nacos 可以连接到您的数据
  • C++中队列的顺序存储

    队列 引言 示例 开发环境 运行结果 引言 队列先进先出 队头出队 队尾入队 其存储可以分为顺序存储和链式储存 本文记录队列的顺序存储 也就是队列中的元素存储的内存空间是连续的 这里使用数组来模拟线性队列 示例 直接上代码 SeqQueue
  • java arraylist 拷贝_Copy ArrayList的四种方式

    Copy ArrayList的四种方式 简介 ArrayList是我们经常会用到的集合类 有时候我们需要拷贝一个ArrayList 今天向大家介绍拷贝ArrayList常用的四种方式 使用构造函数 ArrayList有个构造函数 可以传入一
  • 第三周课程总结&实验报告一

    实验报告 1 打印输出所有的 水仙花数 所谓 水仙花数 是指一个3位数 其中各位数字立方和等于该数本身 例如 153是一个 水仙花数 实验代码 public class ShuiXianHua public static void main
  • L3-014 周游世界 (30 分)

    题目 题目链接 题解 DFS 采用的数据结构 vector 索引为起点 值为 终点 起点公司编号 当然你也可以保存终点公司编号 但是代码中的语句就需要改一下了 dfs 传入四个信息 当前节点 遇到的节点数 换乘数 当前节点所在公司的编号 由