算法--迪杰斯特拉算法 Dijkstra


https: //www.bilibili.com/video/av47427754?from=search&seid=10869921304007190819

import java.util.*;
public class djstl {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        int n = sc.nextInt();                        // n个点 m条边 x为开始点 如1到6 1为开始点
        int m = sc.nextInt();
        int x = sc.nextInt();
        int value[][] = new int[n + 1][n + 1];
        int mindis[] = new int[n + 1];
        for (int i = 1; i <= n; i++) {               // 先初始化 原点为 0 暂时为连线为Integer.MAX_VALUE
            mindis[i] = Integer.MAX_VALUE;           // 最大值简单修改 统一
            for (int j = 1; j <= n; j++) {           // n!!!
                if (i == j)
                    value[i][j] = 0;                 // 自己到自己为0
                else
                    value[i][j] = Integer.MAX_VALUE;
            }
        }
        for (int i = 0; i < m; i++) {                // 传入数据 有向边以及权重 没变还是Integer.MAX_VALUE
            int a = sc.nextInt();
            int b = sc.nextInt();
            int val = sc.nextInt();
            value[a][b] = val;
            if(a == x)
                mindis[b] = val;                     //这里有说明目标点到 过程点的距离是多少
        }
        search( x,  mindis ,  value, n) ;
    }
    private static void search(int x, int dis[] , int value[][],int n) {
        boolean mark[] = new boolean [n+1];
        for(int i = 0 ; i <= n ;i++) {             //初始化
            mark[i] = false;
        }
        mark[x] = true;                              //目标点到自己的位置 的 初始
        dis[x] = 0;
        int count =1;
        while(count <= n) {
            int loc = 0;
            int min = Integer.MAX_VALUE;
            for(int i =1 ; i <= n ;i++) {
                if(!mark[i]&&min>value[x][i]) {    //找第次次最小的点
                    loc = i ;                      //记录第次次最小点所对应的地址
                    min = value[x][i];             //附上最小值
                }
            }
            if(loc == 0)break ;                      //没进去过 直接跳出
            mark[loc] = true ;                      //查找过直接就 true
            count ++;                               //while更新数组
            for(int i = 1 ; i <= n ; i ++) {
                if(!mark[i]&&dis[loc]+value[loc][i]<dis[i]&&value[loc][i]!=Integer.MAX_VALUE) {
                                                     //无路可走 value[loc][i]loc 去i 所对应的权重//  dis[loc]目标点到过程所对应的权重
                    dis[i] = dis[loc]+value[loc][i];
                }
            }
        }
        for(int i =  0 ; i <= n ; i++) {
            if(dis[i]==Integer.MAX_VALUE) {
                System.out.print(" "+0);
                i++;
                }
            System.out.print(" "+dis[i]);
    }
        }
}

原文地址:https://blog.51cto.com/14429166/2417021

时间: 2024-10-11 00:31:59

算法--迪杰斯特拉算法 Dijkstra的相关文章

最短路径算法——迪杰斯特拉算法(Dijkstra)

图结构中应用的最多的就是最短路径的查找了,关于最短路径查找的算法主要有两种:迪杰斯特拉算法(Dijkstra)和Floyd算法. 其中迪杰斯特拉算法(Dijkstra)实现如下: 原理就是不断寻找当前的最优解: void main() { int V[Max][Max]={0,8,32,Infinity,Infinity, 12,0,16,15,Infinity, Infinity,29,0,Infinity,13, Infinity,21,Infinity,0,7, Infinity,Infi

算法-迪杰斯特拉算法(dijkstra)-最短路径

迪杰斯特拉算法(dijkstra)-最短路径 简介: 迪杰斯特拉算法是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有向图中最短路径问题.迪杰斯特拉算法主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止. 算法思想: 设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中

最短路径算法——迪杰斯特拉(Dijkstra)

算法思想 设G=(V,E)是一个带权有向图 把图中顶点集合V分成两组 第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了) 第二组为其余未确定最短路径的顶点集合(用U表示) 按最短路径长度的递增次序依次把第二组的顶点加入S中 在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度 此外,每个顶点对应一个距离,S中的顶点的距离就是从源点v到此顶点的最短

图(最短路径算法————迪杰斯特拉算法和弗洛伊德算法).RP

文转:http://blog.csdn.net/zxq2574043697/article/details/9451887 一: 最短路径算法 1. 迪杰斯特拉算法 2. 弗洛伊德算法 二: 1. 迪杰斯特拉算法 求从源点到其余各点的最短路径 依最短路径的长度递增的次序求得各条路径 路径长度最短的最短路径的特点: 在这条路径上,必定只含一条弧,并且这条弧的权值最小. 下一条路径长度次短的最短路径的特点: 它只可能有两种情况:或是直接从源点到该点(只含一条弧):或者是从源点经过顶点v1,再到达该顶

floyd算法&amp;迪杰斯特拉算法

for(int k=1; k<=n; k++) for(int i=1; i<=n; i++) for(int j=1; j<=n; j++) { gra[i][j]=min(gra[i][j],gra[i][k]+gra[k][j]); } void Dijkstra(int n, int v, int *dist, int *prev, int c[maxx][maxx]) { bool s[maxx]; // 判断是否已存入该点到S集合中 for(int i=1; i<=n;

图的算法--迪杰斯特拉算法

#include<iostream> #include<cstring> #include<cstdio> using namespace std; const int maxn = 100; int map[maxn][maxn]; int dis[maxn]; int path[maxn]; int vis[maxn]; int n; void DIJ(int s) { memset(path, -1, sizeof(path)); memset(dis, 0x3f

数据结构图之三(最短路径--迪杰斯特拉算法——转载自i=i++

数据结构图之三(最短路径--迪杰斯特拉算法) [1]最短路径 最短路径?别乱想哈,其实就是字面意思,一个带边值的图中从某一个顶点到另外一个顶点的最短路径. 官方定义:对于内网图而言,最短路径是指两顶点之间经过的边上权值之和最小的路径. 并且我们称路径上的第一个顶点为源点,最后一个顶点为终点. 由于非内网图没有边上的权值,所谓的最短路径其实是指两顶点之间经过的边数最少的路径. 别废话了!整点实际的哈,你能很快计算出下图中由源点V0到终点V8的最短路径吗? [2]迪杰斯特拉算法 迪杰斯特拉算法是按路

最短路径之迪杰斯特拉(Dijkstra)算法

对于网图来说,最短路径,是指两顶点之间经过的边上权值之和最少的路径,并且我们称路径上的第一个顶点为源点,最后一个顶点为终点.最短路径的算法主要有迪杰斯特拉(Dijkstra)算法和弗洛伊德(Floyd)算法.本文先来讲第一种,从某个源点到其余各顶点的最短路径问题. 这是一个按路径长度递增的次序产生最短路径的算法,它的大致思路是这样的. 初始时,S中仅含有源.设u是G的某一个顶点,把从源到u且中间只经过S中顶点的路称为从源到u的特殊路径,并用数组dist记录当前每个顶点所对应的最短特殊路径长度.D

迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)

迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将 加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中.在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v