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
原文地址:https://www.cnblogs.com/xiu68/p/7993583.html