• Expm 10_1 带负权值边的有向图中的最短路径问题


    【问题描述】

    对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环。

     1 package org.xiu68.exp.exp10;
     2 
     3 public class Exp10_1 {
     4 
     5     public static void main(String[] args) {
     6         // TODO Auto-generated method stub
     7         int[][] edges=new int[][]{
     8             {0,10,0,4,1},
     9             {0,0,0,0,0},
    10             {0,-10,0,0,0},
    11             {0,0,0,0,0},
    12             {0,0,2,0,0}
    13         };
    14         MGraph m1=new MGraph(edges);
    15         System.out.println(m1.bellmanFord(0));
    16     }
    17 
    18 }
    19 
    20 class MGraph{
    21     private int[][] edges;        //有向图边集
    22     private int vexNum;            //顶点数目
    23     private int[] dist;            //源点到该顶点的距离
    24     private int maxDistant;        //表示距离无穷远
    25     
    26     public MGraph(int[][] edges){
    27         this.edges=edges;
    28         this.vexNum=edges.length;
    29         this.dist=new int[vexNum];
    30         this.maxDistant=1000000;
    31     }
    32     
    33     public boolean bellmanFord(int start){
    34         //初始化dist数组
    35         for(int i=0;i<vexNum;i++){
    36                 dist[i]=maxDistant;
    37         }
    38         dist[start]=0;
    39         
    40         for(int i=0;i<vexNum-1;i++){            //从源点到任何一个顶点的最短路径最多有n-1条边
    41             boolean flag=false;                    //记录在本次循环中从源点到某个顶点是否有更短的路径
    42             //遍历所有的边
    43             for(int j=0;j<vexNum;j++){            
    44                 for(int k=0;k<vexNum;k++){
    45                     if(edges[j][k]!=0 && dist[k]>dist[j]+edges[j][k]){
    46                         dist[k]=dist[j]+edges[j][k];
    47                         flag=true;
    48                     }
    49                 }
    50             }
    51             if(flag==false)        //已经求得所有顶点的最短路径
    52                 break;
    53         }
    54         
    55         //本次循环检测是否有负环存在
    56         //从源点到某个顶点有n条边,且路径更短,说明有负环存在
    57         for(int i=0;i<vexNum;i++){
    58             for(int j=0;j<vexNum;j++){
    59                 if(edges[i][j]!=0 && dist[j]>dist[i]+edges[i][j])
    60                     return false;
    61             }
    62         }
    63         
    64         for(int i=0;i<vexNum;i++)
    65             System.out.println(i+":"+dist[i]);
    66         return true;
    67     }
    68 }
    View Code
  • 相关阅读:
    JAVA学习日报 12/15
    JAVA学习日报 12/14
    JAVA学习日报 12/13
    如何在idea上配置meaven和tomcat!(idea2020)
    关于win10共存多个版本jdk,并如何进行最简单的切换
    Java面试知识点
    一些基本html标签的使用案例
    线性代数复习笔记
    考前加分项
    Javaweb学习12.18
  • 原文地址:https://www.cnblogs.com/xiu68/p/7993583.html
Copyright © 2020-2023  润新知