图论记录之最短路迪杰斯特拉

简述思想

这个思想能用一句话来概括,精简到的极致:每次找到一个最短距离的点并更新起点到各个点的最短距离

如果要可视化的化,B站搜索Dijksra算法,有视频讲解

代码

这里是Acwing的851题,下面的有注释

java 复制代码
import java.util.*;

public class Main
{
    private static int N =510;
    private static int n,m;
    private static int[] dist;//存放起点到每个点的最短距离
    private static int[][] g;//邻接矩阵
    private static boolean[] st;//若为true表示已经确定了起点到i点的最短距离
    static Scanner in = new Scanner(System.in);
    static int dijkstra()
    {
       Arrays.fill(dist,100001);
       dist[1]=0;//从起点到起点是0,这个很好理解
       // 迭代n次
       for(int i=0;i<n;i++){
           int t=-1;
           for(int j=1;j<=n;j++){
           		/*
				!st[j]表明j这个点我还没有访问
				t==-1 表明还在初始状态,初始状态必定进入该if分支
				dist[j]<dist[t]我找到了一个比上一次的结果的距离更短的一个点
				*/
               if(!st[j] &&(t==-1 || dist[j]<dist[t]))
                t=j;
           }
           st[t]=true;//标记节点t为访问状态
           for(int j=1;j<=n;j++)
           // 1~t t->j 即先到t,再加上t到j这一段距离,也叫做最后一段距离
            dist[j]=Math.min(dist[j],dist[t]+g[t][j]);
       }
       // 能进入该分支,表明再迭代n次后,没有任何一个点能到达终点n,所以终点不可达,那么返回-1(题目要求的)
       if(dist[n]==100001)
            return -1;
        return dist[n];
    }

    public static void main(String[] args)
    {

        n = in.nextInt();
        m = in.nextInt();
        g = new int[n+1][n+1];
        dist = new int[n+1];
        st=new boolean[n+1];
        for(int[] arr:g)
            //不要写成Integer.MAX_VALUE,由于dist[t]+g[t][j],这个运算操作会溢出
            Arrays.fill(arr,100001);
        while(m-->0){
            int x = in.nextInt();
            int y = in.nextInt();
            int z = in.nextInt();
            //重复边取最小
            g[x][y] = Math.min(g[x][y],z);
        }
        System.out.println(dijkstra());
    }

}
相关推荐
Minner-Scrapy4 分钟前
DApp 开发入门指南
开发语言·python·web app
计算机小白一个23 分钟前
蓝桥杯 Java B 组之岛屿数量、二叉树路径和(区分DFS与回溯)
java·数据结构·算法·蓝桥杯
孤雪心殇24 分钟前
简单易懂,解析Go语言中的Map
开发语言·数据结构·后端·golang·go
庸俗今天不摸鱼36 分钟前
Canvas进阶-4、边界检测(流光,鼠标拖尾)
开发语言·前端·javascript·计算机外设
菠菠萝宝37 分钟前
【Java八股文】10-数据结构与算法面试篇
java·开发语言·面试·红黑树·跳表·排序·lru
奔跑吧邓邓子40 分钟前
【Python爬虫(36)】深挖多进程爬虫性能优化:从通信到负载均衡
开发语言·爬虫·python·性能优化·负载均衡·多进程
不会Hello World的小苗44 分钟前
Java——链表(LinkedList)
java·开发语言·链表
lsx2024061 小时前
Perl 面向对象编程指南
开发语言
Allen Bright1 小时前
【Java基础-46.3】Java泛型通配符详解:解锁类型安全的灵活编程
java·开发语言
柃歌1 小时前
【UCB CS 61B SP24】Lecture 7 - Lists 4: Arrays and Lists学习笔记
java·数据结构·笔记·学习·算法