吾爱破解 - 52pojie.cn

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

查看: 2085|回复: 4
收起左侧

[Java 转载] 【笔记】数据结构与算法之Dijkstra(最短路)

  [复制链接]
QingYi. 发表于 2020-12-31 20:55
第一行包含整数n和m。
接下来m行每行包含三个整数x,y,z,表示存在一条从点x到点y的有向边,边长为z。
所有边权均为正值,请你求出1号点到n号点的最短距离,如果无法从1号点走到n号点,则输出-1。

[Java] 纯文本查看 复制代码
import java.util.Scanner;
/*


适用于稠密的边

 */


public class Main {
    private static int N= 510;
    static int n,m;
    //为稠密阵所以用邻接矩阵存储
    static int[][] g = new int[N][N];
    // distance 距离
    static int [] dist = new int[N];
    //statue  判断当前的点是不是最终确定的最短点
    static  boolean [] st = new boolean[N];
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        n = sc.nextInt();
        m = sc.nextInt();
        for (int i = 0; i < N; i++) {
            for (int j = 0; j < N; j++) {
                //首先把每个点设置无限大
                g[i][j] = 0x3f3f3f;
            }
        }
        while (m-- >0){
            int x = sc.nextInt();
            int y = sc.nextInt();
            int z = sc.nextInt();
            // 如果重边了 保留最短的那条
            g[x][y] = Math.min(g[x][y],z);
        }
        System.out.println(dijkstra());
    }

    private static int dijkstra() {
        //初始化
        for (int i = 0; i < N; i++) {
            dist[i] = 0x3f3f3f;
        }
        // 第一个点到自己的距离是0
        dist[1] = 0;
        for (int i = 0; i < n; i++) {
//           由于每一次都要找到还没有确定最短路距离的所有点中,距离当前的点最短的点。
//           t = - 1是为了在st这个集合中找第一个点更新时候的方便所设定的。
            int t = -1;
            for(int j = 1;j<=n;j++){
                //当前的j没有用过  如果t是-1的话 或者dt > dj  t就等于j
                if (!st[j] && (t==-1 || dist[t]>dist[j])){
                    t = j;
                }
            }
            if (t==n){
                break;
            }
            st[t] = true;
            //找到了距离最小的点t,并用最小的点t去更新其他的点到起点的距离
            for(int j = 1;j<=n;j++){
                dist[j] = Math.min(dist[j],dist[t]+g[t][j]);
            }
        }
        if(dist[n]==0x3f3f3f)  return -1;
        return dist[n];
    }
}

免费评分

参与人数 2吾爱币 +2 热心值 +2 收起 理由
叫不醒装睡的人 + 1 + 1 谢谢@Thanks!
1539173762 + 1 + 1 热心回复!

查看全部评分

发帖前要善用论坛搜索功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。

 楼主| QingYi. 发表于 2020-12-31 20:56
终于考试完考察完了,抽空学习一下
REK_滑稽 发表于 2020-12-31 21:26
云柔猫猫 发表于 2020-12-31 21:52
叫不醒装睡的人 发表于 2020-12-31 21:54
感谢楼主分享
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

返回列表

RSS订阅|小黑屋|处罚记录|联系我们|吾爱破解 - LCG - LSG ( 京ICP备16042023号 | 京公网安备 11010502030087号 )

GMT+8, 2024-11-25 22:54

Powered by Discuz!

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表