算法打卡:第十一章 图论part11

news2024/12/27 0:14:05

今日收获:Floyd 算法,A * 算法,最短路算法总结

1. Floyd 算法

题目链接:97. 小明逛公园

思路:Floyd用于解决多源最短路问题,对边的正负权值没有要求。核心是动态规划

(1)dp数组的定义:grid[i][j][k] = m,表示 节点i 到 节点j 以中间节点[1...k] 集合的最短距离为m

(2)初始化:刚开始从 i 到 j 没有经过任何中间节点,所以 k 初始化为0

(3)遍历顺序:算法相当于不断把新的节点加入,计算起点到终点的最短距离,所以外层遍历 k,里面遍历 i 和 j

(4)递推公式:分为经过/不经过 k 节点,两者取较小值。grid[i][j][k] = min(grid[i][k][k - 1] + grid[k][j][k - 1], grid[i][j][k - 1])

方法:

import java.util.*;

public class Main{
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int N=sc.nextInt();
        int M=sc.nextInt();
        
        int[][][] grid=new int[N+1][N+1][N+1];
        
        // 初始化动态规划数组
        for (int i=0;i<N+1;i++){
            for (int j=0;j<N+1;j++){
                for (int k=0;k<N+1;k++){
                    grid[i][j][k]=10005;
                }
            }
        }
        
        // 接收数据
        for (int i=0;i<M;i++){
            int u=sc.nextInt();
            int v=sc.nextInt();
            int w=sc.nextInt();
            
            grid[u][v][0]=w;  // 双向图
            grid[v][u][0]=w;
        }
        
        
        for (int k=1;k<N+1;k++){
            for (int i=1;i<N+1;i++){
                for (int j=1;j<N+1;j++){
                    // 不经过k点和经过k点
                    grid[i][j][k]=Math.min(grid[i][j][k-1],grid[i][k][k-1]+grid[k][j][k-1]);
                }
            }
        }
        
        int Q=sc.nextInt();
        while (Q>0){
            int start=sc.nextInt();
            int end=sc.nextInt();
            
            if (grid[start][end][N]!=10005){
                System.out.println(grid[start][end][N]);
            }else {
                System.out.println(-1);
            }
            Q--;
        }
        
    }
}

2. A * 算法

题目链接:127. 骑士的攻击

思路:是广度优先搜索的改良版,影响广搜或者 dijkstra 从 容器(队列)里取元素的优先顺序。

(1)BFS 是没有目的性的 一圈一圈去搜索, 而 A * 是有方向性的去搜索。

(2)找方向的关键是启发式函数,通过影响队列中节点的排序确定方向

(3)队列中节点排序的依据:每个节点的权值为F(起点经过当前节点到达终点的距离),公式为:F = G + H

  • G:起点达到目前遍历节点的距离
  • F:目前遍历的节点到达终点的距离

(4)可以使用优先队列这种数据结构对节点排序,取队头元素就是已排序后的结果

方法:

import java.util.*;

public class Main{
    static int[][] moves=new int[1001][1001];  // 记录某个起点到(x,y)的最短路径距离
    static int b1;  // 终点
    static int b2;
    static int[][] dir={{1,2},{2,1},{2,-1},{1,-2},{-1,-2},{-2,-1},{-2,1},{-1,2}};  // 8个方向
    
    public static void main(String[] args){
        Scanner sc=new Scanner(System.in);
        int n=sc.nextInt();
        
        while (n-->0){
            int a1=sc.nextInt();
            int a2=sc.nextInt();
            b1=sc.nextInt();
            b2=sc.nextInt();
            
            // moves数组初始化为0,每个点作为终点的最短路径长度都为0
            for (int i=0;i<1001;i++){
                for (int j=0;j<1001;j++){
                    moves[i][j]=0;
                }
            }
            
            // 起点的骑士
            Knight start=new Knight(a1,a2,0,distance(a1,a2));
            aStar(start);
            
            System.out.println(moves[b1][b2]);
        }
    }
    
    // 广度优先遍历
    public static void aStar(Knight start){
        PriorityQueue<Knight> queue=new PriorityQueue<>(new MyComparison());
        queue.add(start);
        
        while (!queue.isEmpty()){
            Knight cur=queue.poll();  // 当前离终点最近方向的节点
            
            if (cur.x==b1&&cur.y==b2){  // 走到了终点
                break;
            }
            
            for (int i=0;i<8;i++){
                int nextX=cur.x+dir[i][0];
                int nextY=cur.y+dir[i][1];
                
                if (nextX<=0||nextY<=0||nextX>=1001||nextY>=1001){
                    continue;
                }
                
                // 没有被访问过
                if (moves[nextX][nextY]==0){
                    moves[nextX][nextY]=moves[cur.x][cur.y]+1;
                    // 添加节点,马走日
                    queue.offer(new Knight(nextX,nextY,cur.g+5,distance(nextX,nextY)));
                }
            }
        }
        
    }
    
    // 计算当前坐标到终点的欧氏距离
    public static int distance(int x,int y){
        return (x-b1)*(x-b1)+(y-b2)*(y-b2);
    }
}

class Knight{
    int x;  // 骑士当前所处位置的坐标
    int y;
    int g;  // 计算权值
    int h;
    int f;
    
    public Knight(int x,int y,int g,int h){
        this.x=x;
        this.y=y;
        this.g=g;  
        this.h=h;
        this.f=g+h;
    }
}

// 根据权值排序
class MyComparison implements Comparator<Knight>{
    @Override
    public int compare(Knight e1,Knight e2){
        return Integer.compare(e1.f,e2.f);
    }

}

3. 最短路算法总结(from代码随想录)

算法使用场景:

  •  如果遇到单源且边为正数,直接Dijkstra
  • 如果遇到单源边可为负数,直接 Bellman-Ford
  • 如果有负权回路,优先 Bellman-Ford
  • 如果是遇到多源点求最短路,直接 Floyd
  • 游戏开发、地图导航、数据包路由等都广泛使用 A * 算法

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

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

相关文章

Stable Diffusion的Lora使用和训练 如何使用和训练LoRA模型?你想要的都在这!--人人都可以当炼金术士!

随着人工智能技术的不断发展&#xff0c;图像生成与反推技术已经成为了AI领域的一大热点。今天&#xff0c;我们就来为大家详细介绍Stable Diffusion的Lora使用和训练方法&#xff0c;让每个人都能成为炼金术士&#xff0c;创造出属于自己的图像生成魔法&#xff01; 在我们使…

108.WEB渗透测试-信息收集-FOFA语法(8)

免责声明&#xff1a;内容仅供学习参考&#xff0c;请合法利用知识&#xff0c;禁止进行违法犯罪活动&#xff01; 内容参考于&#xff1a; 易锦网校会员专享课 上一个内容&#xff1a;107.WEB渗透测试-信息收集-FOFA语法&#xff08;7&#xff09; 指挥系统的后台&#xff…

把GV幅度还不赶紧地方吧

文章目录 标题1代码 标题1 代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</titl…

pve虚拟机常见问题汇总

一、问题记录 当你遇到 Proxmox VE (PVE) 报错信息 “TASK ERROR: can’t lock file ‘/var/lock/qemu-server/lock-141.conf’ - got timeout”&#xff0c;通常意味着 PVE 尝试对一个虚拟机进行操作&#xff08;如停止或重启&#xff09;时&#xff0c;无法获取必要的锁文件&…

项目管理系统如何实现项目申报流程自动化?

传统的项目申报流程往往繁琐复杂&#xff0c;涉及众多环节和部门间的协作&#xff0c;不仅耗时费力&#xff0c;还容易因人为疏忽而导致错误或延误。随着信息技术的飞速发展&#xff0c;项目管理系统的出现为项目申报流程的自动化提供了可能&#xff0c;极大地提升了申报效率和…

【Windows】自定义显示器的分辨率

背景 由于本人更新驱动导致2个显示器里面&#xff0c;有一个显示器的分辨率只剩下2个可以调节 这样就导致2个显示器分辨率不同&#xff0c;更新了多次驱动都修复不了&#xff0c;所以想着看能不能自定义分辨率 工具下载 显示器自定义分辨率工具 或者百度搜索 Custom Resolu…

基于大数据的二手房价数据可视化系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…

求组合数专题

求组合数 Ⅰ&#xff08;递推公式&#xff09; 思路 递推法预处理 利用公式 复杂度 直接查询 单次查询复杂度 代码 #include <bits/stdc.h> using namespace std; const int N 2010; const int mod 1e97; int c[N][N]; int get_c(int a, int b) {c[0][0] 1;for(i…

解决VRM格式模型在Unity中运行出现头发乱飞等问题

1、问题 通过VRoidStudio制作导出的vrm格式的模型&#xff0c;放在unity中使用时&#xff0c;一运行就会出现头发乱飞&#xff0c;没有自然下垂的问题 2、解决方法 将模型下的secondary中的所有VRM Spring Bone脚本中的Drag Force改为1&#xff0c;Hit Radius改为0 修改后…

SpringBoot+Thymeleaf发票系统

> 这是一个基于SpringBootSpringSecurityThymeleafBootstrap实现的简单发票管理系统。 > 实现了用户登录&#xff0c;权限控制&#xff0c;客户管理&#xff0c;发票管理等功能。 > 并且支持导出为 CSV / PDF / EXCEL 文件。 > 本项目是一个小型发票管理系统…

LeetCode[中等] 24.两两交换链表中的结点

给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成本题&#xff08;即&#xff0c;只能进行节点交换&#xff09;。 思路&#xff1a;递归 头结点head&#xff0c;第二个结点head.next, 交换结点…

【论文阅读】MEDICAL GRAPH RAG: TOWARDS SAFE MEDICAL LARGE LANGUAGE MODEL VIA

论文地址&#xff1a;https://arxiv.org/abs/2408.04187#:~:textWe%20introduce%20a%20novel%20graph-based%20Retrieval-Augmented 代码地址&#xff1a; GitHub - MedicineToken/Medical-Graph-RAG: Medical Graph RAG: Graph RAG for the Medical Data 1 研究背景&#xff1…

LARA:多语言多轮对话意图分类的新突破

人工智能咨询培训老师叶梓 转载标明出处 多轮对话意图分类面临的主要挑战在于对话的复杂性和上下文的不断变化。如图 1 所示。在多轮对话中&#xff0c;意图可能随着对话的进展而变化&#xff0c;这就需要注释者不仅要理解每条消息的内容&#xff0c;还要把握整个对话的上下文…

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27

计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27 目录 文章目录 计算机前沿技术-人工智能算法-大语言模型-最新研究进展-2024-09-27目录1. VisScience: An Extensive Benchmark for Evaluating K12 Educational Multi-modal Scientific Reasoning VisScience:…

Android开发国家手机号归属地列表

Android开发国家手机号归属地列表 国家手机号归属地列表需求不多&#xff0c;但是还是有一些 一、思路&#xff1a; 本地的国家归属号json 二、效果图&#xff1a; 三、关键代码&#xff1a; // 联系&#xff1a;893151960 public class ChooseCountryActivity extends Ap…

golang 获取证书的生效及过期时间

测试样例 func TestGetCertVaildTime(t *testing.T) {certPEM, err : ioutil.ReadFile("aa.bbb.com.crt")if err ! nil {fmt.Println("读取证书文件出错:", err)return}// 解码PEM格式的证书block, _ : pem.Decode(certPEM)if block nil {fmt.Println(&q…

Deep Tone Mapping Operator for High DynamicRange Images

Abstract 计算快速的色调映射算子 (TMO) 可以快速适应各种高动态范围 (HDR) 内容&#xff0c;对于在电影屏幕或标准显示器等各种低动态范围 (LDR) 输出设备上进行可视化至关重要。 现有的 TMO 只能成功地对有限数量的 HDR 内容进行色调映射&#xff0c;并且需要进行广泛的参数…

Mac通过ssh连接工具远程登录服务器( Royal TSX安装及使用)

一、Royal TSX软件下载地址 Royal Apps 二、Royal TSX 汉化 汉化包地址&#xff1a;GitCode - 全球开发者的开源社区,开源代码托管平台 三、基础配置 Royal TSX 是一款基于插件的应用&#xff0c;刚安装时还不具备使用条件&#xff0c;需要进行一些基础配置 1 安装基础插件…

银行CRM系统的核心功能解析与应用价值

在当今竞争激烈的金融市场中&#xff0c;银行业务的成功与否&#xff0c;越来越依赖于高效而精准的客户关系管理系统&#xff08;CRM&#xff09;。Zoho CRM系统不仅帮助银行提升服务质量、增强客户满意度&#xff0c;还能有效地促进业务发展和风险控制。为了帮助读者更好地理解…

蓝鹏螺纹钢测径仪的三大测量要点 纵肋 横肋 基圆

关键字:螺纹钢测径仪,螺纹钢纵肋测量,螺纹钢横肋测量,纵肋间隙测量,横肋间隙测量,螺纹钢基圆测量, 螺纹钢测径仪在测量螺纹钢时&#xff0c;主要关注纵肋、横肋和基圆这三大要点。以下是针对这三个方面的详细测量要点&#xff1a; 一、纵肋的测量要点 纵肋是螺纹钢表面上的凹陷…