【问题描述】
对于一个带负权值边的有向图,实现Bellman-Ford算法,求出从指定顶点s到其余顶点的最短路径,并判断图中是否存在负环。
![](https://i-blog.csdnimg.cn/blog_migrate/8f900a89c6347c561fdf2122f13be562.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/961ddebeb323a10fe0623af514929fc1.gif)
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 }