zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    2019 USP Try-outs 练习赛
    XDTIC2019招新笔试题 + 官方解答
    2019 ICPC 南昌网络赛
    ICPC 2019 徐州网络赛
    Berlekamp Massey算法求线性递推式
    ICPC 2018 徐州赛区网络赛
    CCPC 2019 网络赛 1006 Shuffle Card
    CCPC 2019 网络赛 1002 array (权值线段树)
    CCF-CSP题解 201803-4 棋局评估
    CCF-CSP题解 201803-3 URL映射
  • 原文地址:https://www.cnblogs.com/xiu68/p/7993583.html
Copyright © 2011-2022 走看看