首页 > 编程语言 > 详细

迪杰斯特拉算法完整代码(Java)

时间:2019-12-11 18:25:21      阅读:110      评论:0      收藏:0      [点我收藏+]
package com.rao.graph;

import java.util.*;

/**
 * @author Srao
 * @className Dijkstra
 * @date 2019/12/10 22:15
 * @package com.rao.graph
 * @Description 迪杰斯特拉算法
 */
public class Dijkstra {

    /**
     * 图的顶点
     */
    private static class Vertex{
        String data;
        Vertex(String data){
            this.data = data;
        }
    }

    /**
     * 图的边
     */
    private static class Edge{
        //从adj[i]到index
        int index;
        //到index的距离
        int weight;
        public Edge(int index, int weight) {
            this.index = index;
            this.weight = weight;
        }
    }

    /**
     * 图(邻接矩阵)
     */
    private static class Graph{
        private Vertex[] vertices;
        private LinkedList<Edge>[] adj;
        Graph(int size){
            vertices = new Vertex[size];
            adj = new LinkedList[size];
            for (int i = 0; i < adj.length; i++) {
                adj[i] = new LinkedList<>();
            }
        }
    }

    /**
     * 初始化图
     * @param graph
     */
    private static void initGraph(Graph graph){
        graph.vertices[0] = new Vertex("A");
        graph.vertices[0] = new Vertex("B");
        graph.vertices[0] = new Vertex("C");
        graph.vertices[0] = new Vertex("D");
        graph.vertices[0] = new Vertex("E");
        graph.vertices[0] = new Vertex("F");
        graph.vertices[0] = new Vertex("G");

        graph.adj[0].add(new Edge(1, 5));
        graph.adj[0].add(new Edge(2, 2));
        graph.adj[1].add(new Edge(0, 5));
        graph.adj[1].add(new Edge(3, 1));
        graph.adj[1].add(new Edge(4, 6));
        graph.adj[2].add(new Edge(0, 2));
        graph.adj[2].add(new Edge(3, 6));
        graph.adj[2].add(new Edge(5, 8));
        graph.adj[3].add(new Edge(1, 1));
        graph.adj[3].add(new Edge(2, 6));
        graph.adj[3].add(new Edge(4, 1));
        graph.adj[3].add(new Edge(5, 2));
        graph.adj[4].add(new Edge(1, 6));
        graph.adj[4].add(new Edge(3, 1));
        graph.adj[4].add(new Edge(6, 7));
        graph.adj[5].add(new Edge(2, 8));
        graph.adj[5].add(new Edge(3, 2));
        graph.adj[5].add(new Edge(6, 3));
        graph.adj[6].add(new Edge(4, 7));
        graph.adj[6].add(new Edge(5, 3));
    }

    /**
     * 迪杰斯特拉算法
     * @param graph:图
     * @param startIndex:图的起点
     * @return
     */
    public static Map<Integer, Integer> dijkstra(Graph graph, int startIndex){
        //创建距离表,存放起点到每一个点的距离,默认值为无穷大
        Map<Integer, Integer> distanceMap = new HashMap<>();
        //记录已经遍历过的顶点
        Set<Integer> accessedSet = new HashSet<>();
        //图的顶点数量
        int size = graph.vertices.length;
        //初始化距离表
        for (int i = 1; i < size; i++) {
            distanceMap.put(i, Integer.MAX_VALUE);
        }
        //遍历起点,刷新距离表
        accessedSet.add(0);
        List<Edge> edgesFromStart = graph.adj[startIndex];
        for (Edge edge : edgesFromStart) {
            distanceMap.put(edge.index, edge.weight);
        }
        //循环遍历所有的点,并且刷新距离表
        for (int i = 1; i < size; i++) {
            //寻找到顶点最短的距离的点
            int minDistanceFromStart = Integer.MAX_VALUE;
            int minDistanceIndex = -1;
            for (int j = 1; j < size; j++) {
                if (!accessedSet.contains(j) && distanceMap.get(j) < minDistanceFromStart){
                    minDistanceFromStart = distanceMap.get(j);
                    minDistanceIndex = j;
                }
            }
            if (minDistanceIndex == -1){
                break;
            }
            //遍历这个最小距离的顶点
            accessedSet.add(minDistanceIndex);
            for (Edge edge : graph.adj[minDistanceIndex]) {
                if (accessedSet.contains(edge.index)){
                    continue;
                }
                int weight = edge.weight;
                int preDistance = distanceMap.get(edge.index);
                if (weight != Integer.MAX_VALUE && (minDistanceFromStart + weight) < preDistance){
                    distanceMap.put(edge.index, minDistanceFromStart + weight);
                }
            }
        }
        return distanceMap;
    }

    public static void main(String[] args) {
        Graph graph = new Graph(7);
        initGraph(graph);
        Map<Integer, Integer> distanceMap = dijkstra(graph, 0);
        int distance = distanceMap.get(6);
        System.out.println(distance);
    }
}

  。

迪杰斯特拉算法完整代码(Java)

原文:https://www.cnblogs.com/rao11/p/12024051.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!