单源最短路径--Bellman-Ford算法

BELLMAN-FORD最短路径算法:

BELLMAN-FORD(G,w,s)
1 INITIALIZE-SINGLE-SOURCE(G,s)
2 for i = 1 to |G.V| - 1
3   for each edge(u,v) belong to G.E
4      RELAX(u,v,w)
5 for each edge(u,v) belong to G.E
6   if v.d > u.d + w(u,v)
7     return FALSE
8 return TRUE

初始化算法:

INITIALIZE-SINGLE-SOURCE(G,s)
1 for each vertex v belong to G.V
2   v.d = infty
3   v.pi = NIL
4 s.d = 0

松弛操作:

RELAX(u,v,w)
1 if v.d > u.d + w(u,v)
2   v.d = u.d + w(u,v)
3   v.pi = u

java实现代码如下:

    /**
     * 初始化操作
     * @param vertexs
     * @param startID
     */
    public static void initialize_single_source(List<Vertex> vertexs, int startID){
        for (Vertex vertex : vertexs){
            vertex.setD(50000);
            vertex.setParent(null);
        }
        Vertex start = Vertex.getVertex(startID);
        start.setD(0);
    }

    /**
     * 松弛操作
     * @param u
     * @param v
     * @param w 边(u,v)
     * @throws Exception 
     */
    public static void relax(Edge w){
        if (w.getDest().getD() > w.getStart().getD() + w.getWeight()){
            w.getDest().setD(w.getStart().getD() + w.getWeight());
            w.getDest().setParent(w.getStart());
        }       
    }

    public static boolean bellman_ford(String graphContent, int startID){
        List<Vertex> vertexs = Route.getVertexs(graphContent);
        initialize_single_source(vertexs, startID);
        Edge[] edges = Route.getEdges(graphContent);

        for (int i = 0; i < edges.length; i++){
            for (Edge edge : edges){
                relax(edge);
            }
        }
        for (Edge edge : edges){
            if (edge.getDest().getD() > edge.getStart().getD() + edge.getWeight()){
                return false;
            }
        }
        return true;
    }

    /**
     * 打印最短路径
     * @param graphContent
     * @param startID
     * @param destID
     */
    public static void print_Path(String graphContent, int startID, int destID){
        if (bellman_ford(graphContent, startID)){
            Vertex v = Vertex.getVertex(destID);
            if (v.equal(startID)){
                System.out.print(Vertex.getVertex(startID)+ "(" + Vertex.getVertex(startID).getD() + ")--");
            }else if (v.getParent() == null){
                System.out.println("\nno path from \"s\" to \"v\" exists");
            }else {
                print_Path(graphContent, startID, v.getParent().getID());
                System.out.print(v + "(" + v.getD() + ")--");
            }
        }
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值