zoukankan      html  css  js  c++  java
  • Dijkstra搜索算法

    Dijkstra无向图

    算法执行步骤如下:

    上面两张图来源于:http://blog.csdn.net/v_july_v/article/details/6096981

    很牛的大神,膜拜,此处有鲜花

    Dijkstra 的算法实现

    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    
    
    public class Dijkstra {
        List<verPoint>Graph;
        
        
        public List<verPoint> getGraph() {
            return Graph;
        }
    
    
        public void setGraph(List<verPoint> graph) {
            Graph = graph;
        }
        
        public double minDistance(double minD,Map<Integer,Double>distance,List<verPoint>Graph,List<verPoint>S,List<verPoint>U){
            
            if(S==null){
                S = new ArrayList();
                U = new ArrayList();
                S.add(Graph.get(0));
                for(int i = 0;i<Graph.size();i++){
                    if(!S.contains(Graph.get(i))){
                        U.add(Graph.get(i));
                    }
                }
            }
            if(S.size()==Graph.size()){
                
                return minD;
            }
            verPoint nowPoint = S.get(S.size()-1);
            
            Map <Integer,Double>newdistance = new HashMap();
            double []dis = new double[U.size()];
            for(int i = 0;i<U.size();i++){
                dis[i] = minD + nowPoint.distancePoint(U.get(i));//直接加上到U.get(i)的距离
                if(dis[i]>distance.get(U.get(i).getId())){//与上一次到U.get(i)距离的比较
                    dis[i]=distance.get(U.get(i).getId());
                }
                newdistance.put(U.get(i).getId(), dis[i]);
            }
            
            //寻找dis中最小的值所对应的索引值
            int mindex = 0;
            for(int i = 1;i<dis.length;i++){
                if(dis[mindex]>dis[i]){
                    mindex = i;
                }
            }
            double newMinD = dis[mindex];
            S.add(U.get(mindex));
            U.remove(mindex);
            for(int i = 0;i<S.size();i++){
                System.out.print("  "+S.get(i).getVerName());
            }
            System.out.println();
            double min = minDistance(newMinD,newdistance,Graph,S,U);
            return min;
        }
        
        
    
    }

    应当注意的是:

    1、minD存储的是每次搜寻后当前点与初始点之间的最小距离

    2、distance中存储的是仍在open中的点到初始点的最小距离

    3、每次循环的时候,首先将未在S中的点放入U中。S表示路径,U表示剩余点;

    其次,计算S最后面的一点到U中每个点的距离,并且如果上一次也到过U中某个节点,则注意比较这两次到同一节点的距离,取更小的。然后取U中各节点最小距离,并放入S中直至S中元素等于图的元素个数

  • 相关阅读:
    sql:drop、delete、truncate的区别
    pgsql:插入数据,存在就更新,不存在就插入
    sql:多表连接查询
    克隆模式
    canvas 实现星空闪烁的效果,鼠标滑动,连接周围的点
    JS微信网页图片预览可放大缩小
    muduo_base 02 (Atomic)
    muduo_base 01 (Timestamp)
    select/poll/epoll
    socket编程(二)
  • 原文地址:https://www.cnblogs.com/yunerlalala/p/6151735.html
Copyright © 2011-2022 走看看