代码随想录打卡第六十一天

news2024/11/25 16:34:39

代码随想录–图论部分

day 62 图论第十一天(完结)


文章目录

  • 代码随想录–图论部分
  • 一、卡码网97--小明逛公园
  • 二、卡码网126--骑士的攻击
  • 总结


一、卡码网97–小明逛公园

代码随想录题目链接:代码随想录

给定一个公园景点图,图中有 N 个景点(编号为 1 到 N),以及 M 条双向道路连接着这些景点。每条道路上行走的距离都是已知的。

小明有 Q 个观景计划,每个计划都有一个起点 start 和一个终点 end,表示他想从景点 start 前往景点 end。由于小明希望节省体力,他想知道每个观景计划中从起点到终点的最短路径长度。 请你帮助小明计算出每个观景计划的最短路径长度。

本题是Floyd算法的应用,解决的是多源最短路问题

也就是求多个起点多个终点的多条最短路径,实际上还是动态规划问题

代码如下:

#include <iostream>
#include <vector>
#include <list>
using namespace std;

int main() {
    int n, m, p1, p2, val;
    cin >> n >> m;

    vector<vector<vector<int>>> grid(n + 1, vector<vector<int>>(n + 1, vector<int>(n + 1, 10005)));  // 因为边的最大距离是10^4
    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        grid[p1][p2][0] = val;
        grid[p2][p1][0] = val; // 注意这里是双向图

    }
    // 开始 floyd
    for (int k = 1; k <= n; k++) {
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= n; j++) {
                grid[i][j][k] = min(grid[i][j][k-1], grid[i][k][k-1] + grid[k][j][k-1]);
            }
        }
    }
    // 输出结果
    int z, start, end;
    cin >> z;
    while (z--) {
        cin >> start >> end;
        if (grid[start][end][n] == 10005) cout << -1 << endl;
        else cout << grid[start][end][n] << endl;
    }
}

二、卡码网126–骑士的攻击

代码随想录题目链接:代码随想录

在象棋中,马和象的移动规则分别是“马走日”和“象走田”。现给定骑士的起始坐标和目标坐标,要求根据骑士的移动规则,计算从起点到达目标点所需的最短步数。

也就是A*算法,实际上就是广度优先搜索不再是一圈一圈盲目地搜索,而是加上启发式算法来确定搜索方向

代码如下:

#include<iostream>
#include<queue>
#include<string.h>
using namespace std;
int moves[1001][1001];
int dir[8][2]={-2,-1,-2,1,-1,2,1,2,2,1,2,-1,1,-2,-1,-2};
int b1, b2;
// F = G + H
// G = 从起点到该节点路径消耗
// H = 该节点到终点的预估消耗

struct Knight{
    int x,y;
    int g,h,f;
    bool operator < (const Knight & k) const{  // 重载运算符, 从小到大排序
     return k.f < f;
    }
};

priority_queue<Knight> que;

int Heuristic(const Knight& k) { // 欧拉距离
    return (k.x - b1) * (k.x - b1) + (k.y - b2) * (k.y - b2); // 统一不开根号,这样可以提高精度
}
void astar(const Knight& k)
{
    Knight cur, next;
	que.push(k);
	while(!que.empty())
	{
		cur=que.top(); que.pop();
		if(cur.x == b1 && cur.y == b2)
		break;
		for(int i = 0; i < 8; i++)
		{
			next.x = cur.x + dir[i][0];
			next.y = cur.y + dir[i][1];
			if(next.x < 1 || next.x > 1000 || next.y < 1 || next.y > 1000)
			continue;
			if(!moves[next.x][next.y])
			{
				moves[next.x][next.y] = moves[cur.x][cur.y] + 1;

                // 开始计算F
				next.g = cur.g + 5; // 统一不开根号,这样可以提高精度,马走日,1 * 1 + 2 * 2 = 5
                next.h = Heuristic(next);
                next.f = next.g + next.h;
                que.push(next);
			}
		}
	}
}

int main()
{
    int n, a1, a2;
    cin >> n;
    while (n--) {
        cin >> a1 >> a2 >> b1 >> b2;
        memset(moves,0,sizeof(moves));
        Knight start;
        start.x = a1;
        start.y = a2;
        start.g = 0;
        start.h = Heuristic(start);
        start.f = start.g + start.h;
		astar(start);
        while(!que.empty()) que.pop(); // 队列清空
		cout << moves[b1][b2] << endl;
	}
	return 0;
}

总结

关于最短路径问题,基本可以依照下图来确定算法
在这里插入图片描述
图论的总结在:这里

一刷结束,开始二刷巩固了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Flink常用转换(transformation)算子使用教程(DataSTream API)

前言 一个 Flink 程序,其实就是对 DataStream 的各种转换。具体来说,代码基本上都由以下几部分构成,如下图所示: 获取执行环境(execution environment)读取数据源(source)定义基于数据的转换操作(transformations)定义计算结果的输出位置(sink)触发程序执行(exec…

Linux入门——06 基础IO

1.什么是当前路径 exe -> /home/lin/Desktop/Linux_learn/fork_learn/test 当前进程执行是磁盘路径下的哪一个程序 cwd -> /home/lin/Desktop/Linux_learn/fork_learn 当前进程的工作目录------》当前进程 1.1当前路径这个地址能改吗&#xff1f; 可以&#xff0c;使…

spring-boot-maven-plugin:repackage分析

springboot项目打包插件为&#xff1a;spring-boot-maven-plugin,使用如下: <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http://www.w3.org/2001/XMLSchema-instance&…

【python实现通过复数进程互相检测防止关闭和删除】

python实现通过复数进程互相检测防止关闭和删除 要使用 Python 实现通过多个进程互相检测来防止关闭和删除&#xff0c;可以使用 multiprocessing 模块来创建多个进程&#xff0c;并通过进程间通信来实现心跳检测。以下是一个简单的示例代码&#xff0c;展示了如何使用两个进程…

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法

【学术前沿】基于非易失性存储器硬件特性的存算一体神经网络设计方法 Lixia HAN, Peng HUANG, Yijiao WANG, Zheng ZHOU, Haozhang YANG, Yiyang CHEN, Xiaoyan LIU & Jinfeng KANG, Mitigating Methodology of Hardware Non-ideal Characteristics for Non-volatile Memo…

经常打喷嚏和浮毛猫毛满天飞有关吗?能去浮毛的空气净化器推荐

近年来&#xff0c;随着生活品质的提升&#xff0c;越来越多的家庭选择养宠物&#xff0c;养宠物的同时也带来了不少的困扰。比如&#xff0c;下班归家&#xff0c;迎接的可能是满室的异味与漂浮的毛发&#xff0c;瞬间让好心情大打折扣。长期置身于这样的环境中还对健康有影响…

笔记本没电造成数据丢失怎么恢复?速览几种有效方法

在日常使用笔记本电脑的过程中&#xff0c;我们时常会遇到电量耗尽而突然关机的情况。这种突如其来的断电不仅可能打断我们的工作流程&#xff0c;更有可能导致未保存的数据丢失&#xff0c;给我们的生活和工作带来不小的困扰。面对这种情况&#xff0c;许多用户可能会感到手足…

Jellyfin10.9.x解决色调映射无法使用的问题

环境 物理机为12100的CPU、精粤 H610I的主板、16G2内存、闪迪1TB M.2固态、希捷酷鹰3.5寸4TB硬盘4。 物理机安装了PVE后在PVE安装了NAS、OP、Windows 10、HA、Ubuntu还利用LXC模板安装了Debian12 里面套娃了Jellyfin。不过我的Jellyfin不是部署在docker中的。 问题 但是当我…

NSSCTF练习记录:[SWPUCTF 2021 新生赛]ez_caesar

题目&#xff1a; import base64 def caesar(plaintext):str_list list(plaintext)i 0while i < len(plaintext):if not str_list[i].isalpha():str_list[i] str_list[i]else:a "A" if str_list[i].isupper() else "a"str_list[i] chr((ord(str_…

蓝队技能-应急响应篇勒索病毒系统样本家族解密渠道寄生入口异常定性处置封锁

知识点 1、应急响应-勒索病毒-定性&排查 2、应急响应-勒索病毒-应急&处置1、什么是勒索病毒&#xff1f; 勒索病毒是一种新型电脑病毒&#xff0c;主要以RDP爆破、邮件、程序木马、网页挂马的形式进行传播。该病毒性质恶劣、危害极大&#xff0c;一旦感染将给用户带来…

vue3 RouterLink路由跳转后RouterView组件未加载,页面未显示,且控制台无任何报错

在使用 vue3 开发项目过程中&#xff0c;组件之间使用 router-link 跳转&#xff0c;但是当我开发的组件跳转到其他组件时&#xff0c;其他组件的页面未加载&#xff0c;再跳转回自己的组件时&#xff0c;自己的组件也加载不出来了&#xff0c;浏览器刷新后页面可以加载出来。但…

点亮希望之灯:解决孩子自闭症的探索之路

在这个充满活力与挑战的世界里&#xff0c;有一群特殊的孩子&#xff0c;他们仿佛生活在自己的孤独星球上&#xff0c;难以与外界进行有效的沟通和互动。他们是自闭症儿童&#xff0c;也被称为 “星星的孩子”。面对这些孩子的自闭症问题&#xff0c;我们该如何寻找解决之道呢&…

C语言06--数组进阶

数组名含义 数组名有两个含义&#xff1a; 第一含义是&#xff1a;整个数组第二含义是&#xff1a;首元素的地址当出现以下情形时&#xff0c;那么数组名就代表整个数组&#xff1a; 在数组定义中在 sizeof 运算表达式中 &#xff0c;因此sizeof 计算的就是整个数组的大小。si…

《黑神话:悟空》风灵月影V1.0-35项修改器全面解析

《黑神话&#xff1a;悟空》作为一款备受瞩目的魂系动作角色扮演游戏&#xff0c;以其细腻的画面、流畅的操作和深厚的剧情吸引了众多玩家的关注。然而&#xff0c;对于不少玩家来说&#xff0c;游戏的高难度设置也带来了不小的挑战。为此&#xff0c;风灵月影工作室特别推出了…

[Spring] Spring原理(SpringBoot完结)

&#x1f338;个人主页:https://blog.csdn.net/2301_80050796?spm1000.2115.3001.5343 &#x1f3f5;️热门专栏: &#x1f9ca; Java基本语法(97平均质量分)https://blog.csdn.net/2301_80050796/category_12615970.html?spm1001.2014.3001.5482 &#x1f355; Collection与…

【15】Java字节码

Java方法栈帧的组成&#xff1a;操作数栈局部变量表 操作数栈 Java字节码是Java虚拟机所使用的的指令集。它与JVM基于栈的计算模型是分不开的。 在解释执行过程中&#xff0c;每当为 Java 方法分配栈桢时&#xff0c;Java 虚拟机往往需要开辟一块额外的空间作为操作数栈&…

JavaEE 第16节 线程安全的集合类

目录 前言 顺序表 队列 哈希表 1、Hashtable 2、ConcurrentHashMap&#xff08;重点&#xff09; 前言 本文章主要介绍在多线程环境下&#xff0c;如何线程安全的使用一些常用的集合类&#xff08;顺序表和哈希表&#xff09;。 顺序表 1、自己使用同步锁机制&#xff…

模拟笔试:卡码网2023年快手笔试真题

1.158同余方程 思路 纯数学的思路&#xff0c;想不出来的话很难做。 欧几里得算法视频讲解 代码 #include <iostream> using namespace std;// 扩展欧几里得&#xff1a;计算 ax by gcd(a, b) 的解 long long extended_gcd(long long a, long long b, long long &a…

Java语言程序设计——篇十五(5)

&#x1f33f;&#x1f33f;&#x1f33f;跟随博主脚步&#xff0c;从这里开始→博主主页&#x1f33f;&#x1f33f;&#x1f33f; 欢迎大家&#xff1a;这里是我的学习笔记、总结知识的地方&#xff0c;喜欢的话请三连&#xff0c;有问题可以私信&#x1f333;&#x1f333;&…

【STM32嵌入式系统设计与开发拓展】——16_FreeRTOS操作系统

参考&#xff1a;链接: 正点原子 一、认识裸机和RTOS 裸机是无操作系统支持&#xff0c;程序直接运行在硬件上&#xff0c;开发者要自行处理硬件细节。早期单片机常采用&#xff0c;优点是性能和资源利用率高&#xff0c;缺点是开发难、可移植性差。RTOS 是实时操作系统&…