试题 算法训练 逗志芃的暴走

news/2024/7/20 21:56:34 标签: 算法, 深度优先

问题描述

  逗志芃是有妹子的现充,但是有时候妹子就是烦恼。因为逗志芃太逗了,所以这段时间妹子对逗志芃发动了技能无理取闹,妹子要去玩很多的景点。由于逗志芃之前抽机花费了太多的时间,不久以后又要微积分考试了,所以现在被妹子搞成暴走状态了。但是妹子永远是上帝,所以逗志芃只能带妹子出去玩,不过为了节约时间,他希望找到一条花费时间最少的一次性游览线路。

输入格式

  第一行1个数n,表示逗志芃所在的城市有多少个景点,接下来是一个n*n的矩阵。a(i,j)表示i号景点到j号景点的路上花费的时间是多少。
  接下来是一个数m,表示逗志芃妹子要去去的景点数目。由于妹子在无理取闹,所以可能会有重复的景点,不过只要去一次就可以了。接下来是m个数,就是妹子要去的景点编号。

输出格式

  一个数,最少的花费时间。

样例输入

3
0 1 2
1 0 3
2 3 0
3
2 3 1

样例输出

3

数据规模和约定

  0<n<=30,0<m<=20,时间<=1000000

#include<iostream>
#include<string.h>
using namespace std;

int n;
int map[31][31] = {0};
int visit[31] = {0};
int aim[31] = {0};
int realm = 0;
int ans = 99999;
	
void mySort() {
	for (int k = 1; k <= n; k ++) {
		for (int i = 1; i <= n; i ++) {
			for (int j = 1; j <= n;  j ++) {
				map[i][j] = min(map[i][j], map[i][k] + map[k][j]);
			}
		}
	}
}

void dfs(int start, int num, int Tans) {
	if (num == realm) {
		ans = min(ans, Tans);
		return;
	}
	
	for (int i = 1; i <= n; i ++) {
		if (aim[i] == 1 && visit[i] == 0 && Tans + map[start][i] <= ans) {
			visit[i] = 1;
			dfs(i, num + 1, Tans + map[start][i]);
			visit[i] = 0;
		}
	}
}

int main() {
	cin >> n;
	
	for (int i = 1; i <= n; i ++) {
		for (int j = 1; j <= n; j ++) {
			cin >> map[i][j];
		}
	}
	
	mySort();
	
	int m;
	
	cin >> m;
	
	for (int i = 0; i < m; i ++) {
		int temp;
		
		cin >> temp;
		
		if (aim[temp] == 0) {
			realm++;
			aim[temp] = 1;
		}
	}
	
	for (int i = 1; i <= n; i ++) {
		if (aim[i] != 0) {
			memset(visit, 0, sizeof(visit));
			visit[i] = 1;
			dfs(i, 1, 0);
		}
	}
	
	cout << ans;
	
	return 0;
}

总结:

mySort是用来将路径重新排一下

让map[i][j]表示从i到j所用时间最少,后面用来找最小路径

aim数组表示要去的景点

visit数组表示去过的景点

realm用来找真正要去的景点的个数

然后在dfs中遍历所有景点,满足

1.是要去的景点

2.还没去过的景点(因为每个景点只需要去一次)

3.当前已经花了的时间+走那个条路线要花的时间要小于当前的最小时间

之后就继续递归遍历找最小花费时间


http://www.niftyadmin.cn/n/165397.html

相关文章

《程序员面试金典(第6版)》面试题 05.01. 插入

题目描述 给定两个整型数字 N 与 M&#xff0c;以及表示比特位置的 i 与 j&#xff08;i < j&#xff0c;且从 0 位开始计算&#xff09;。 编写一种方法&#xff0c;使 M 对应的二进制数字插入 N 对应的二进制数字的第 i ~ j 位区域&#xff0c;不足之处用 0 补齐。具体插…

基于springboot开发的学生考勤管理系统【毕业论文,源码】

基于springboot开发的学生考勤管理系统如需更多资料请前往文章底部获取联系方式 系统设计主要功能 通过市场调研及咨询研究&#xff0c;了解了学生考勤管理系统及管理者的使用需求&#xff0c;于是制定了管理员&#xff0c;教师和学生等模块。功能结构图如下所示 E/R图 考…

玩转k8s(七)—— 数据管理

一.、Volume 容器和Pod是短暂的&#xff0c;会被频繁的销毁和创建&#xff0c;为了持久化保存容器的数据&#xff0c;可以使用 Kubernetes Volume。 本质上&#xff0c;Volume是一个目录&#xff0c;这一点与Docker Volume类似。当Volume被mount到Pod&#xff0c;Pod中的所有容…

OpenMV入门介绍

这里写目录标题一、OpenMV是什么二、OpenART mini与OpenMV对比三、图像处理背景知识1.像素和分辨率2. 帧率3.RGB三原色4.LAB颜色空间四、OpenMV图像处理方法1.感光元件自动增益/白平衡/曝光窗口ROI2.画图画线画框画圆画十字写字示例3. 寻找色块&#xff08;颜色识别&#xff09…

linux环境下利用rsync+find实现同步指定时间段文件

文章目录前言插曲根据时间段同步按时间过滤文件使用 mtime 参数查找使用 newermt 进行更精确查找总结前言 这几天一直在处理shell脚本&#xff0c;作为服务器开发人员免不了要部署一些环境&#xff0c;数据备份和同步工作也是家常便饭&#xff0c;最近常搞的几个命令有 find、…

新星计划——为什么写博客

为什么写博客 写博客好处多多&#xff0c;自我感觉嘛有以下好处。 1. 加深自己对知识的理解 写博客可以像写笔记一般使自己对知识的理解更加深刻以及更加全面&#xff0c;使我们能够更清晰的了解所学知识的框架&#xff0c;当然日后进行知识的复习也更加便捷。 2. 真正掌握技术…

c++STL急急急

文章目录cSTL急急急vector头文件扩容过程用法&#xff1a;size/emptyclear迭代器begin/endfront/backpush_back() 和 pop_back()queue头文件用法循环队列 queue用法优先队列 priority_queue用法stack头文件deque头文件deque中控器&#xff1a;用法set头文件用法迭代器begin/end…

玩转k8s(八)—— Secret Configmap

应用启动过程中可能需要一些敏感信息&#xff0c;比如访问数据库的用户名&#xff0c;密码或密钥&#xff0c;将这些信息直接保存在容器镜像中显然不妥&#xff0c;k8s提供的解决方案是 Serect。 Serect 会以密文的方式存储数据&#xff0c;避免了直接再配置文件中把偶从你敏感…