首页 > 编程语言 >Dijkstra算法求带权图的单源最短路径

Dijkstra算法求带权图的单源最短路径

时间:2022-11-24 17:06:29浏览次数:35  
标签:求带 dist int length 单源 vis Dijkstra 顶点 prev


Dijkstra算法:

给出一个带权无向图,要求指定顶点到图中每一个点的最短路径。

首先我们定义一个邻接矩阵c,c[i][j]用来表示从顶点i到顶点j的权重,用一个一维数组prev[]来记录指定节点的父节点,如果不需要输出路径的轨迹,那么就不需要用到这个数组。用一个vis的boolean数组存储每一个节点是否被访问过。用一个dist[]数组来存储指定顶点到每一个顶点的最短路径。

1、搜索判断指定顶点v到每一个顶点是否有边连接,并在搜索的过程中吧vis数组初始化为false(Java则省略这一步),如果两个顶点之间有边连接,那么就令prev[i]=v;令dist[v]=0,vis[v]=true;

2、用一个循环来寻找剩下的n-1个顶点到指定顶点的最短路。在dist数组中找到一条没被访问过的到指定顶点的最短路径,然后记录该顶点u,把该顶点的vis设置为true;

3、在第二步找到的顶点u中,寻找与顶点u有边相连而且又没有被访问过的顶点,然后计算该顶点从顶点u这条路径到达顶点v的距离:

if(!vis[j]&&c[u][j]>0) {



int tempDis = dist[u] + c[u][j];

if(tempDis<dist[j]) {

dist[j] = tempDis;

prev[j] = u;

}

}


完整代码如下:

public class Dijkstra {

public static void main(String[] args) {
// TODO Auto-generated method stub
int[][] c = {
{0, 10, 0, 30, 100},
{10, 0, 50, 0, 0},
{0, 50, 0, 20, 10},
{30, 0, 20, 0, 60},
{100, 0, 10, 60, 0}
};
dijkstra(0, c);
}

public static void dijkstra(int v, int[][] c) {
int[] dist = new int[c.length];
int[] prev = new int[c.length];
boolean[] vis = new boolean[c.length];
for(int i = 0; i < dist.length; i++) {
dist[i] = Integer.MAX_VALUE;
}
for(int i = 0; i < dist.length; i++) {
dist[i] = c[v][i] == 0 ? Integer.MAX_VALUE : c[v][i];
if(dist[i] > 0) {
prev[i] = v;
}
}
dist[v] = 0;
vis[v] = true;
prev[v] = -1;

for(int i = 1; i < dist.length; i++) {
int curMin = Integer.MAX_VALUE;
int u = 0;
//贪心算法找一个到指定顶点距离最短的点
for(int j = 0; j < dist.length; j++) {
if(!vis[j] && dist[j] < curMin) {
curMin = dist[j];
u = j;
}
}
//令vis[u] = true,因为已经访问过顶点u了
vis[u] = true;
//在找到该顶点u后,更新与u相邻的点到顶点v的距离
for(int j = 0; j < dist.length; j++) {
if(!vis[j] && c[u][j] > 0) {
int tempDis = dist[u] + c[u][j];
if(tempDis < dist[j]) {
dist[j] = tempDis;
prev[j] = u;
}
}
}
}

//打印操作........
for(int i = 0; i < dist.length; i++) {
System.out.print(dist[i] + " ");
}
System.out.println();
for(int i = 0; i < dist.length; i++) {
System.out.print(prev[i] + " ");
}
System.out.println();

}

}



 

标签:求带,dist,int,length,单源,vis,Dijkstra,顶点,prev
From: https://blog.51cto.com/u_15890522/5884201

相关文章

  • pat dijkstra系列题目代码详解
    1003:1#include<bits/stdc++.h>2usingnamespacestd;3#defineintlonglong4#defineIOSios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);5const......
  • 存题(图的相关判断和两道精品dijkstra)
    图的判断:https://pintia.cn/problem-sets/994805342720868352/exam/problems/994805351814119424https://pintia.cn/problem-sets/994805342720868352/exam/problems/994......
  • Dijkstra Algorithm
    与BFS不同的是每条路径多了权重1.步骤:找到最便宜的节点,即可在最短时间内前往的节点对于该节点的邻居,检查是否有前往它们的更短路径,如果有,就更新其开销。重复这个过程,直到对......
  • 必须经过关键点或达成某些状态的单源最短路-01bfs
    https://ac.nowcoder.com/acm/contest/45670/D题目描述:小竹成功从家里逃了出来,他决定去小胖家避一避。但是小胖要求小竹带一个刺激度大于xx的游戏才能去他家。为了防......
  • 堆排序优化版Dijkstra
    Dijkstra依旧基于贪心用堆排序动态维护剩余点中dist[]最小的点堆排序优化Dijkstra算法 稀疏图,用邻接表,稠密也可以 void add(int a,int b,int c){    e[i......
  • 朴素Dijkstra
     朴素dijkstra其实就是数据结构学的,很简单。 朴素dijkstra算法就是暴力枚举n个点,每次枚举找到离本次枚举点最近的点a,然后用点a来更新所有其他点的距离void d......
  • kafka 客户端之producer API发送消息以及简单源码分析
    背景:我使用docker-compose搭建的kafka服务​kafka的简单介绍以及docker-compose部署单主机Kafka集群​​KafkaAPI简单介绍kafka除了用于管理和管理任务的命令行工具,Kafka......
  • 数据结构 最短生成路径(BFS算法、Floyd(弗洛伊德)算法、Dijkstra算法)
    8.9、最短生成路径-BFS算法BFS算法只能处理无权图BFS算法的基本思想代码实现#include<stdio.h>#include<stdlib.h>#include<math.h>#defineMaxSize100#defin......
  • 朴素的dijkstra最短路径算法
    dijkstra算法适用于无负权图中求最短路径,时间复杂度为O(n^2+e),n为节点数,e为边数需要的数据:1.n行两列数组arr[n][2],第一列记录当前节点到出发点的最短距离,第二列记录当......
  • 算法导论(第24章 单源最短路径)
    目录问题描述最短路径的几个变体最短路径的最优子结构负权重的边环路最短路径的表示松弛操作最短路径和松弛操作的性质本章概要24.1\(Bellman-Ford\)算法24.2有向无环图......