服务热线:13616026886

技术文档 欢迎使用技术文档,我们为你提供从新手到专业开发者的所有资源,你也可以通过它日益精进

位置:首页 > 技术文档 > JAVA > 新手入门 > 基础入门 > 查看文档

单源点最短路径dijkstra算法的java实现

在城市智能交通中,经常会用到最短路径的问题,比如找最佳的行车路线等,dijkstra算法做为最经典的求解方法,为我们指明了方向.不过真正想让我了解该算法的原因是在学习ictclas的n-最短路径算法,虽然和我们常用的案例有一点区别,但基本相同,为了更好的理解n-最短路径算法,我又重新把大学时代的数据结构知识搬了出来。

在网上找到一篇文章,非常详细生动(有flash动画演示)的描述了该算法的实现,不过第一页右下角的图终点那一列2和3弄反了,看的时候要注意 ,具体的算法描述不再赘述,请参考:

http://student.zjzk.cn/course_ware/data_structure/web/tu/tu7.5.1.htm

下面给出我的算法实现具体代码,为了更好的验证程序的正确性,在原来的基础上我又多加了几条边

单源点最短路径dijkstra算法的java实现(图一)package sinboy.datastructure;
单源点最短路径dijkstra算法的java实现(图一)
单源点最短路径dijkstra算法的java实现(图一)import java.util.arraylist;
单源点最短路径dijkstra算法的java实现(图一)
单源点最短路径dijkstra算法的java实现(图二)单源点最短路径dijkstra算法的java实现(图三)public class dijkstra ...{
单源点最短路径dijkstra算法的java实现(图四)    static arraylist<side> map = null;
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    static arraylist<integer> redagg = null;
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    static arraylist<integer> blueagg = null;
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    static side[] parents = null;
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static void main(string[] args) ...{
单源点最短路径dijkstra算法的java实现(图四)        // 初始化顶点集
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        int[] nodes = ...{ 0, 1, 3, 2, 4, 5,6 };
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        // 初始化有向权重图
单源点最短路径dijkstra算法的java实现(图四)        map = new arraylist<side>();
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(0, 1, 10));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(0, 3, 30));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(0, 4, 100));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(1, 2, 50));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(2, 4, 10));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(3, 2, 20));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(3, 4, 60));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(4, 5, 50));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(3, 5, 60));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(5, 6, 10));
单源点最短路径dijkstra算法的java实现(图四)        map.add(new side(3, 6, 80)); 
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        // 初始化已知最短路径的顶点集,即红点集,只加入顶点0
单源点最短路径dijkstra算法的java实现(图四)        redagg = new arraylist<integer>();
单源点最短路径dijkstra算法的java实现(图四)        redagg.add(nodes[0]);
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        // 初始化未知最短路径的顶点集,即蓝点集
单源点最短路径dijkstra算法的java实现(图四)        blueagg = new arraylist<integer>();
单源点最短路径dijkstra算法的java实现(图四)        for (int i = 1; i < nodes.length; i++)
单源点最短路径dijkstra算法的java实现(图四)            blueagg.add(nodes[i]);
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        // 初始化每个顶点在最短路径中的父结点,及它们之间的权重,权重-1表示无连通
单源点最短路径dijkstra算法的java实现(图四)        parents = new side[nodes.length];
单源点最短路径dijkstra算法的java实现(图四)        parents[0] = new side(-1, nodes[0], 0);
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        for (int i = 0; i < blueagg.size(); i++) ...{
单源点最短路径dijkstra算法的java实现(图四)            int n = blueagg.get(i);
单源点最短路径dijkstra算法的java实现(图四)            parents[i + 1] = new side(nodes[0], n, getweight(nodes[0], n));
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        // 找从蓝点集中找出权重最小的那个顶点,并把它加入到红点集中 
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        while (blueagg.size() > 0) ...{
单源点最短路径dijkstra算法的java实现(图四)            minshortpath msp = getminsidenode();
单源点最短路径dijkstra算法的java实现(图四)            if(msp.getweight()==-1)
单源点最短路径dijkstra算法的java实现(图四)                msp.outputpath(nodes[0]);
单源点最短路径dijkstra算法的java实现(图四)            else
单源点最短路径dijkstra算法的java实现(图四)                msp.outputpath();
单源点最短路径dijkstra算法的java实现(图四)            
单源点最短路径dijkstra算法的java实现(图四)            int node = msp.getlastnode();
单源点最短路径dijkstra算法的java实现(图四)            redagg.add(node); 
单源点最短路径dijkstra算法的java实现(图四)            // 如果因为加入了新的顶点,而导致蓝点集中的顶点的最短路径减小,则要重要设置
单源点最短路径dijkstra算法的java实现(图四)            setweight(node);
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四) 
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    /** *//**
单源点最短路径dijkstra算法的java实现(图四)     * 得到一个节点的父节点
单源点最短路径dijkstra算法的java实现(图四)     * 
单源点最短路径dijkstra算法的java实现(图四)     * @param parents
单源点最短路径dijkstra算法的java实现(图四)     * @param node
单源点最短路径dijkstra算法的java实现(图四)     * @return
单源点最短路径dijkstra算法的java实现(图七)     */
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static int getparent(side[] parents, int node) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        if (parents != null) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)            for (side nd : parents) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                if (nd.getnode() == node) ...{
单源点最短路径dijkstra算法的java实现(图四)                    return nd.getprenode();
单源点最短路径dijkstra算法的java实现(图七)                }
单源点最短路径dijkstra算法的java实现(图七)            }
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四)        return -1;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    /** *//**
单源点最短路径dijkstra算法的java实现(图四)     * 重新设置蓝点集中剩余节点的最短路径长度
单源点最短路径dijkstra算法的java实现(图四)     * 
单源点最短路径dijkstra算法的java实现(图四)     * @param prenode
单源点最短路径dijkstra算法的java实现(图四)     * @param map
单源点最短路径dijkstra算法的java实现(图四)     * @param blueagg
单源点最短路径dijkstra算法的java实现(图七)     */
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static void setweight(int prenode) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        if (map != null && parents != null && blueagg != null) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)            for (int node : blueagg) ...{
单源点最短路径dijkstra算法的java实现(图四)                minshortpath msp=getminpath(node);
单源点最短路径dijkstra算法的java实现(图四)                int w1 = msp.getweight();
单源点最短路径dijkstra算法的java实现(图四)                if (w1 == -1)
单源点最短路径dijkstra算法的java实现(图四)                    continue;
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                for (side n : parents) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                    if (n.getnode() == node) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                        if (n.getweight() == -1 || n.getweight() > w1) ...{
单源点最短路径dijkstra算法的java实现(图四)                            n.setweight(w1);
单源点最短路径dijkstra算法的java实现(图四)                            n.setprenode(prenode);//重新设置顶点的父顶点
单源点最短路径dijkstra算法的java实现(图四)                            break;
单源点最短路径dijkstra算法的java实现(图七)                        }
单源点最短路径dijkstra算法的java实现(图七)                    }
单源点最短路径dijkstra算法的java实现(图七)                }
单源点最短路径dijkstra算法的java实现(图七)            }
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    /** *//**
单源点最短路径dijkstra算法的java实现(图四)     * 得到两点节点之间的权重
单源点最短路径dijkstra算法的java实现(图四)     * 
单源点最短路径dijkstra算法的java实现(图四)     * @param map
单源点最短路径dijkstra算法的java实现(图四)     * @param prenode
单源点最短路径dijkstra算法的java实现(图四)     * @param node
单源点最短路径dijkstra算法的java实现(图四)     * @return
单源点最短路径dijkstra算法的java实现(图七)     */
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static int getweight(int prenode, int node) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        if (map != null) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)            for (side s : map) ...{
单源点最短路径dijkstra算法的java实现(图四)                if (s.getprenode() == prenode && s.getnode() == node)
单源点最短路径dijkstra算法的java实现(图四)                    return s.getweight();
单源点最短路径dijkstra算法的java实现(图七)            }
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四)        return -1;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    /** *//**
单源点最短路径dijkstra算法的java实现(图四)     * 从蓝点集合中找出路径最小的那个节点
单源点最短路径dijkstra算法的java实现(图四)     * 
单源点最短路径dijkstra算法的java实现(图四)     * @param map
单源点最短路径dijkstra算法的java实现(图四)     * @param blueagg
单源点最短路径dijkstra算法的java实现(图四)     * @return
单源点最短路径dijkstra算法的java实现(图七)     */
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static minshortpath getminsidenode() ...{
单源点最短路径dijkstra算法的java实现(图四)        minshortpath minmsp = null;
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        if (blueagg.size() > 0) ...{
单源点最短路径dijkstra算法的java实现(图四)            int index = 0;
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)            for (int j = 0; j < blueagg.size(); j++) ...{
单源点最短路径dijkstra算法的java实现(图四)                minshortpath msp = getminpath(blueagg.get(j));
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                if (minmsp == null || msp.getweight()!=-1 &&  msp.getweight() < minmsp.getweight()) ...{
单源点最短路径dijkstra算法的java实现(图四)                    minmsp = msp;
单源点最短路径dijkstra算法的java实现(图四)                    index = j;
单源点最短路径dijkstra算法的java实现(图七)                }
单源点最短路径dijkstra算法的java实现(图七)            }
单源点最短路径dijkstra算法的java实现(图四)            blueagg.remove(index);
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四)        return minmsp;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    /** *//**
单源点最短路径dijkstra算法的java实现(图四)     * 得到某一节点的最短路径(实际上可能有多条,现在只考虑一条)
单源点最短路径dijkstra算法的java实现(图四)     * @param node
单源点最短路径dijkstra算法的java实现(图四)     * @return
单源点最短路径dijkstra算法的java实现(图七)     */
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public static minshortpath getminpath(int node) ...{
单源点最短路径dijkstra算法的java实现(图四)        minshortpath msp = new minshortpath(node);
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)        if (parents != null && redagg != null) ...{
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)            for (int i = 0; i < redagg.size(); i++) ...{
单源点最短路径dijkstra算法的java实现(图四)                minshortpath tempmsp = new minshortpath(node);
单源点最短路径dijkstra算法的java实现(图四)                int parent = redagg.get(i);
单源点最短路径dijkstra算法的java实现(图四)                int curnode = node;
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                while (parent > -1) ...{
单源点最短路径dijkstra算法的java实现(图四)                    int weight = getweight(parent, curnode);
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)                    if (weight > -1) ...{
单源点最短路径dijkstra算法的java实现(图四)                        tempmsp.addnode(parent);
单源点最短路径dijkstra算法的java实现(图四)                        tempmsp.addweight(weight);
单源点最短路径dijkstra算法的java实现(图四)                        curnode = parent;
单源点最短路径dijkstra算法的java实现(图四)                        parent = getparent(parents, parent);
单源点最短路径dijkstra算法的java实现(图七)                    } else
单源点最短路径dijkstra算法的java实现(图四)                        break;
单源点最短路径dijkstra算法的java实现(图七)                }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)                if (msp.getweight() == -1 || tempmsp.getweight()!=-1 && msp.getweight() > tempmsp.getweight())
单源点最短路径dijkstra算法的java实现(图四)                    msp = tempmsp;
单源点最短路径dijkstra算法的java实现(图七)            }
单源点最短路径dijkstra算法的java实现(图七)        }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)        return msp;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图八)}
单源点最短路径dijkstra算法的java实现(图一)
单源点最短路径dijkstra算法的java实现(图二)单源点最短路径dijkstra算法的java实现(图三)/** *//**
单源点最短路径dijkstra算法的java实现(图四) * 图中的有向边,包括节点名及他的一个前向节点名,和它们之间的权重
单源点最短路径dijkstra算法的java实现(图四) * 
单源点最短路径dijkstra算法的java实现(图八) */
单源点最短路径dijkstra算法的java实现(图二)单源点最短路径dijkstra算法的java实现(图三)class side ...{
单源点最短路径dijkstra算法的java实现(图四)    private int prenode; // 前向节点
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    private int node;// 后向节点
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    private int weight;// 权重
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public side(int prenode, int node, int weight) ...{
单源点最短路径dijkstra算法的java实现(图四)        this.prenode = prenode;
单源点最短路径dijkstra算法的java实现(图四)        this.node = node;
单源点最短路径dijkstra算法的java实现(图四)        this.weight = weight;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public int getprenode() ...{
单源点最短路径dijkstra算法的java实现(图四)        return prenode;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public void setprenode(int prenode) ...{
单源点最短路径dijkstra算法的java实现(图四)        this.prenode = prenode;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public int getnode() ...{
单源点最短路径dijkstra算法的java实现(图四)        return node;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public void setnode(int node) ...{
单源点最短路径dijkstra算法的java实现(图四)        this.node = node;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public int getweight() ...{
单源点最短路径dijkstra算法的java实现(图四)        return weight;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)单源点最短路径dijkstra算法的java实现(图六)    public void setweight(int weight) ...{
单源点最短路径dijkstra算法的java实现(图四)        this.weight = weight;
单源点最短路径dijkstra算法的java实现(图七)    }
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图八)}
单源点最短路径dijkstra算法的java实现(图一)
单源点最短路径dijkstra算法的java实现(图二)单源点最短路径dijkstra算法的java实现(图三)class minshortpath ...{
单源点最短路径dijkstra算法的java实现(图四)    private arraylist<integer> nodelist;// 最短路径集
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图四)    private int weight;// 最短路径
单源点最短路径dijkstra算法的java实现(图四)
单源点最短路径dijkstra算法的java实现(图五)