算法训练营第七十六天(最后一天、完结撒花) | Bellmanford之单源有限最短路、Floyd算法、A*算法

算法训练营最后一天 | Bellmanford之单源有限最短路、Floyd算法、A*算法

Bellmanford之单源有限最短路

题目连接:
https://kamacoder.com/problempage.php?pid=1154

在之前的基础上松弛k+1次而不是n+1次即可

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

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

    vector<vector<int>> grid;

    for(int i = 0; i < m; i++){
        cin >> p1 >> p2 >> val;
        grid.push_back({p1, p2, val});
    }

    cin >> src >> dst >> k;

    vector<int> minDist(n + 1 , INT_MAX);
    minDist[src] = 0;
    vector<int> minDist_copy(n + 1); // 用来记录上一次遍历的结果
    for (int i = 1; i <= k + 1; i++) {
        minDist_copy = minDist; // 获取上一次计算的结果
        for (vector<int> &side : grid) {
            int from = side[0];
            int to = side[1];
            int price = side[2];
            // 注意使用 minDist_copy 来计算 minDist 
            if (minDist_copy[from] != INT_MAX && minDist[to] > minDist_copy[from] + price) {  
                minDist[to] = minDist_copy[from] + price;
            }
        }
    }
    if (minDist[dst] == INT_MAX) cout << "unreachable" << endl; // 不能到达终点
    else cout << minDist[dst] << endl; // 到达终点最短路径

}

Floyd算法

题目链接:
https://kamacoder.com/problempage.php?pid=1155

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

A*算法

题目链接:
https://kamacoder.com/problempage.php?pid=1203

#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.mfbz.cn/a/773451.html

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

相关文章

thinkadmin 新增和编辑页面多选关联表人员信息,并可按名称搜索查询

假如现在有一个窗口表和人员表,窗口表中的user_ids字段存储多个工作人员,人员表的id在窗口表的user_ids字段中存储为 “1,2,3”,代表3个工作人员,通过以下代码实现 form.html <div class="layui-col-xs12"><span class="help-label

自动驾驶理论新突破登Nature子刊!清华、密歇根联合提出三条技术路线,剑指「稀疏度灾难」

自动驾驶理论新突破登Nature子刊&#xff01;清华、密歇根联合提出三条技术路线&#xff0c;剑指「稀疏度灾难」 近日&#xff0c;清华大学与密歇根大学联合提出的自动驾驶汽车安全性「稀疏度灾难」问题&#xff0c;发表在了顶刊《Nature Communications》上。研究指出&#…

【12321骚扰电话举报受理中心-短信验证安全分析报告】

前言 由于网站注册入口容易被黑客攻击&#xff0c;存在如下安全问题&#xff1a; 暴力破解密码&#xff0c;造成用户信息泄露短信盗刷的安全问题&#xff0c;影响业务及导致用户投诉带来经济损失&#xff0c;尤其是后付费客户&#xff0c;风险巨大&#xff0c;造成亏损无底洞…

揭秘:华火电焰灶可不可信,安不安全?

随着科技的不断进步&#xff0c;传统厨房灶具也在经历着前所未有的变革。在这个追求环保、节能和智能化的时代&#xff0c;最近发布的一款名为华火电燃喷焰式组合灶厨吸引了众多消费者的目光。今天&#xff0c;我们就来对这款华火HH-SZQP60电燃喷焰式组合灶进行一次深入评测&am…

谷粒商城学习-06-使用vagrant快速创建linux虚拟机

这一节的内容是在Windows上安装虚拟机。 为什么要按照虚拟机呢&#xff1f; 原因是很多软件只能在Linux下运行&#xff0c;有的虽然也可以在Windows上运行&#xff0c;但从安装到运行会遇到很多问题&#xff0c;为这些解决这些问题花时间对于大多数人特别是初学者是没有什么价…

Qt中udp指令,大小端,帧头帧尾实际示例

前言 虽然QT中&#xff0c;udp发送和接收&#xff0c;其实非常简单&#xff0c;但是实际工作中&#xff0c;其实涉及到帧头帧尾&#xff0c;字节对齐&#xff0c;以及大小端序的问题。比如网络中&#xff0c;正规的一般都是大端序&#xff0c;而不是小端序&#xff0c;大多数的…

Arthas实战(3)- CPU使用率高问题排查

一、 准备测试应用 新建一个 SpringBoot应用&#xff0c;写一段 CPU 使用率高的代码&#xff1a; GetMapping("/cpuUsageRate") public String cpuUsageRate() {while (true) {// 这个循环没有实际意义&#xff0c;只是为了占用CPUfor (int i 0; i < 1_000_000…

(三)共享模型之管程

线程安全问题 案例 两个线程对初始值为 0 的静态变量一个做自增&#xff0c;一个做自减&#xff0c;各做 5000 次&#xff0c;结果是 0 吗&#xff1f; Slf4j(topic "c.ThreadSafe") public class ThreadSafe {public static int counter 0;public static void …

南京,协同开展“人工智能+”行动

南京&#xff0c;作为江苏省的省会城市&#xff0c;一直以来都是科技创新和产业发展的高地。近日&#xff0c;南京市政府正式印发了《南京市进一步促进人工智能创新发展行动计划&#xff08;2024—2026 年&#xff09;》和《南京市促进人工智能创新发展若干政策措施》的“11”文…

Linux Static Keys和jump label机制

文章目录 前言一、asm goto二、API使用2.1 低版本API2.2 高版本API 三、jump label四、源码分析4.1 数据结构4.2 static_key_false4.3 jump_label_init4.4 __jump_label_transform4.5 static_key_slow_inc/dec 五、__jump_table节5.1 内核5.2 内核模块 六、修改内存代码6.1 x86…

vue配置sql规则

vue配置sql规则 实现效果组件完整代码父组件 前端页面实现动态配置sql条件&#xff0c;将JSON结构给到后端&#xff0c;后端进行sql组装。 这里涉及的分组后端在组装时用括号将这块规则括起来就行&#xff0c;分组的sql连接符&#xff08;并且/或者&#xff09;取组里的第一个。…

论文配色:跟着顶刊学配色(Nature篇)

写在前面&#xff1a; 截至目前&#xff0c;nature共发表Article 572篇&#xff0c;本文挑选了部分最新的文献&#xff0c;进行配色总结&#xff0c;每种颜色分别提供十六进制、RGB、HSB、CMYK和LAB5种描述模型&#xff0c;方便后期配色使用。 三色&#xff1a; 四色&#xff…

Java增加线程后kafka仍然消费很慢

文章目录 一、问题分析二、控制kafka消费速度属性三、案例描述 一、问题分析 Java增加线程通常是为了提高程序的并发处理能力&#xff0c;但如果Kafka仍然消费很慢&#xff0c;可能的原因有&#xff1a; 网络延迟较大&#xff1a;如果网络延迟较大&#xff0c;即使开启了多线…

【MindSpore学习打卡】应用实践-计算机视觉-SSD目标检测:从理论到实现

在计算机视觉领域&#xff0c;目标检测是一个至关重要的任务。它不仅要求识别图像中的目标物体&#xff0c;还需要精确定位这些物体的位置。近年来&#xff0c;随着深度学习技术的飞速发展&#xff0c;各种高效的目标检测算法层出不穷。SSD&#xff08;Single Shot MultiBox De…

推动高效能:东芝TB67H301FTG全桥直流电机驱动IC

在如今高度自动化的时代&#xff0c;电子产品的性能和效率成为了工程师们关注的焦点。东芝的TB67H301FTG全桥直流电机驱动IC应运而生&#xff0c;以其卓越的技术和可靠性&#xff0c;成为众多应用的理想选择。无论是在机器人、家用电器、工业自动化&#xff0c;还是在其他需要精…

企业怎么选购USB Server?先看这条!

一、首先&#xff0c;USB Server是什么&#xff1f; USB Server&#xff1f;听起来像是个高科技玩意儿&#xff01; 其实&#xff0c;它就是个很多企业都在用的远程“传送门”&#xff0c;把USB设备都固定插在USB Server上&#xff0c;然后将USB Server与计算机网络连接&…

LaTeX表格灵活设置列宽

一些基本的插入表格的操作见&#xff1a;https://blog.csdn.net/gsgbgxp/article/details/129457872 遇到问题先查阅《IShort》和刘海洋老师的《LaTeX入门》。 设置表格列宽基础操作&#xff08;不借助tabularx&#xff09; 先从一个简单表格开始 \begin{table}[!h]\centeri…

Python基础小知识问答系列-过滤列表元素

1. 问题&#xff1a; 如何根据单一条件过滤列表的元素&#xff1f; 如何根据复杂条件过滤列表的元素&#xff1f; 2. 解决方式&#xff1a; 可以使用推导式生成器&#xff0c;进行单一条件的列表元素过滤&#xff0c;尤其是列表内容较多时; 也可以使用filter函数进行列…

怎么看一家TPM管理咨询公司专不专业

在评估一家TPM管理咨询公司是否专业时&#xff0c;我们需要从多个维度进行深入的考量。TPM作为一种以提升设备综合效率为目标&#xff0c;以全系统的预防维修为过程&#xff0c;以全体人员参与为基础的设备保养和维修管理体系&#xff0c;其实施的成功与否直接关系到企业的生产…

二二复制模式,发展下属并形成一个销售网络体系来实现收入增长!

二二复制模式&#xff0c;又称为双轨制&#xff0c;是一种直销理念的营销模式&#xff0c;其核心在于通过发展下属并形成一个销售网络体系来实现收入增长。以下是对二二复制模式的详细讲解&#xff0c;包括其优势和玩法介绍&#xff0c;以及适合的行业。 一、二二复制模式的定…