ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

图最短路径之BellmanFord

2021-08-29 15:32:00  阅读:123  来源: 互联网

标签:BellmanFord weight get int 路径 edge edges vertexList


定义

贝尔曼-福特算法,可以从给定一个图和图中的源顶点src,找到从src到给定图中所有顶点的最短路径。该图可能包含负权重边。相对于Dijkstra算法的优势是可以处理负权重边,缺点则是复杂度高于Dijkstra 。具体算法的详细解析请参考https://www.geeksforgeeks.org/bellman-ford-algorithm-dp-23/,以下代码也是参考https://www.geeksforgeeks.org/bellman-ford-algorithm-dp-23/,只是根据自己的需要增加了一些东西。

package graph.bellman_ford;

import lombok.Data;

public class Graph {
   private final int vertexCount;
   private final int edgeCount;
   private final Edge[] edge;

   public Graph(int vertexCount, int edgeCount, Edge[] edge) {
       this.vertexCount = vertexCount;
       this.edgeCount = edgeCount;
       this.edge = edge;
  }

   @Data
   public static class Edge {
       Vertex source;
       Vertex destination;
       int weight;
  }

   @Data
   public static class Vertex {
       int sequence;
       String code;
       String name;
  }


   public void bellmanFord(Graph graph, int src) {
       int[] distance = new int[vertexCount];
       
       for (int i = 0; i < vertexCount; ++i) {
           distance[i] = Integer.MAX_VALUE;
      }
       distance[src] = 0;

 
       for (int i = 1; i < vertexCount; ++i) {
           for (int j = 0; j < edgeCount; ++j) {
               int u = graph.edge[j].source.sequence;
               int v = graph.edge[j].destination.sequence;
               int weight = graph.edge[j].weight;
               if (distance[u] != Integer.MAX_VALUE && distance[u] + weight < distance[v]) {
                   distance[v] = distance[u] + weight;
              }
          }
      }

   
       for (int j = 0; j < edgeCount; ++j) {
           int u = graph.edge[j].source.sequence;
           int v = graph.edge[j].destination.sequence;
           int weight = graph.edge[j].weight;
           if (distance[u] != Integer.MAX_VALUE && distance[u] + weight < distance[v]) {
               return;
          }
      }
       printArr(distance, vertexCount);
  }

   public void printArr(int[] distance, int vertexCount) {
       for (int i = 0; i < vertexCount; ++i) {
           System.out.println(i + "\t\t" + distance[i]);
      }
  }
}

测试

package graph.bellman_ford;

import java.util.ArrayList;
import java.util.List;

public class ShortestPathOfBellmanFord {

  public static void main(String[] args) {


      List<Graph.Vertex> vertexList = new ArrayList<>();
      for (int i = 0; i < 5; i++) {
          Graph.Vertex vertex = new Graph.Vertex();
          vertex.code = "code" + i;
          vertex.name = "name" + i;
          vertex.sequence = i;
          vertexList.add(vertex);
      }
      Graph.Edge[] edges = new Graph.Edge[8];
      for (int i = 0; i < edges.length; i++) {
          edges[i] = new Graph.Edge();
      }

      // edge 0 --> 1
      edges[0].source = vertexList.get(0);
      edges[0].destination = vertexList.get(1);
      edges[0].weight = -1;


      // edge 0 --> 2
      edges[1].source = vertexList.get(0);
      edges[1].destination = vertexList.get(2);
      edges[1].weight = 4;

      // edge 1 --> 2
      edges[2].source = vertexList.get(1);
      edges[2].destination = vertexList.get(2);
      edges[2].weight = 3;

      // edge 1 --> 3
      edges[3].source = vertexList.get(1);
      edges[3].destination = vertexList.get(3);
      edges[3].weight = 2;

      // edge 1 --> 4
      edges[4].source = vertexList.get(1);
      edges[4].destination = vertexList.get(4);
      edges[4].weight = 2;

      // edge 3 --> 2
      edges[5].source = vertexList.get(3);
      edges[5].destination = vertexList.get(2);
      edges[5].weight = 5;

      // edge 3 --> 1
      edges[6].source = vertexList.get(3);
      edges[6].destination = vertexList.get(1);
      edges[6].weight = 1;

      // edge 4--> 3
      edges[7].source = vertexList.get(4);
      edges[7].destination = vertexList.get(3);
      edges[7].weight = -3;


      Graph graph = new Graph(5, 8, edges);
      graph.bellmanFord(graph, 0);
  }
}

 

标签:BellmanFord,weight,get,int,路径,edge,edges,vertexList
来源: https://www.cnblogs.com/wkynf/p/15202669.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有