zoukankan      html  css  js  c++  java
  • 最短路径

    过去的代码有些地方现在看来有些怪怪的,例如MGraph里面public的成员变量。

    没有提现java的封装的思想。 

    另外,添加必要非空判断。否则参数传null必定报错。 

    entity:

    /**
     * @author 无名
    * @Description:邻接矩阵
    * @date 2015-12-29 上午10:02:16 
     */
    public class MGraph
    {
        // 顶点为空
        public static final int NULL = 1000;
    
        // 邻接矩阵
        private int[][] edges = new int[9][9];
    
        // 顶点数和边数
        private int n, e;
    
        public int[][] getEdges()
        {
            return edges;
        }
    
        public void setEdges(int[][] edges)
        {
            this.edges = edges;
        }
    
        public int getN()
        {
            return n;
        }
    
        public void setN(int n)
        {
            this.n = n;
        }
    
        public int getE()
        {
            return e;
        }
    
        public void setE(int e)
        {
            this.e = e;
        }

     图操作,及求最短路径代码:

    package com.alg.utils;
    
    import com.entity.MGraph;
    
    /**
     * @author 无名
     * @date 2014年,2015-12-29 上午10:09:17修改,entity提现java封装思想,加入get,set;
     *                                                              方法添加非空判断。
     * @Description: 邻接矩阵基本操作
     */
    public class MgraphUtils
    {
        // 根据二维数组,生成邻接矩
        public static void createMat(MGraph g, int A[][], int n)
        {
            if(null == A||null == g)
                return;
            int e = 0;
            int[][] edges = new int[9][9];
            for (int i = 0; i < n; i++)
                for (int j = 0; j < n; j++)
                {
                    edges[i][j] = A[i][j];
                    if (edges[i][j] != MGraph.NULL)
                        e++;
                }
            g.setN(n);
            g.setEdges(edges);
            g.setE(e);
        }
    
        // 输出邻接矩阵
        public static void DispMat(MGraph g)
        {
            if(null == g)
                return;
            int i, j,n=g.getN();
            int[][] edges = g.getEdges();
            for (i = 0; i < n; i++)
            {
                for (j = 0; j < n; j++)
                {
                    if (edges[i][j] == MGraph.NULL)
                        System.out.print("-" + " ");
                    else
                        System.out.print(edges[i][j] + " ");
                }
                System.out.println();
            }
        }
    
        // Dijkstra算法
        public static void Dijkstra(MGraph mgraph, int v0)
        {
            if(null == mgraph)
                return;
            final int INFINITY = 65535;
            // 用于存储最短路径下标数组
            int[] pathMatirx = new int[9];
            // 用于存储到各点最短路径权值
            int[] shortPathTable = new int[9];
            int min, v, w, k = 0;
            // finalGot[n] = 1表示求得v0 - vn最短路径
            int[] finalGot = new int[9];
            
            int mgraphN = mgraph.getN();
            int[][] mgraphEdges = mgraph.getEdges();
            
            // 初始化数据
            for (v = 0; v < mgraphN; v++)
            {
                // 全部顶点初始化为未知最短路径状态
                finalGot[v] = 0;
                // 将与与v0有连线的点加上权值
                shortPathTable[v] = mgraphEdges[v0][v];
                // 初始化路径数组为0
                pathMatirx[v] = 0;
            }
            // v0至v0路径为0
            shortPathTable[v0] = 0;
            // v0至v0不须求路径
            finalGot[v0] = 1;
            for (v = 1; v < mgraph.getN(); v++)
            {
                min = INFINITY;
                // 寻找距v0最近顶点
                for (w = 0; w < mgraphN; w++)
                {
                    if (finalGot[w] == 0 && shortPathTable[w] < min)
                    {
                        k = w;
                        min = shortPathTable[w];
                    }
                }
                // 将找到的顶点标记为1
                finalGot[k] = 1;
                // 修正当前最短路径及距离
                for (w = 0; w < mgraphN; w++)
                {
                    // 如果经过v顶点的路径比现在这条路径距离短的话
                    if (finalGot[w] == 0
                            && (min + mgraphEdges[k][w] < shortPathTable[w]))
                    {
                        shortPathTable[w] = min + mgraphEdges[k][w];
                        pathMatirx[w] = k;
                    }
                }
            }
            // 输出
            System.out.println("Dijkstra算法求得最短路径:  ");
            for (v = 1; v < mgraphN; v++)
            {
                k = v;
                System.out.print(k + "->");
                while (k != v0)
                {
                    k = pathMatirx[k];
                    System.out.print(k + "->");
                }
                System.out.println();
            }
        }
    
        // 弗洛伊德算法基本思想与Dijkstra算法相似
        public static void Floyd(MGraph mgraph)
        {
            if(null == mgraph)
                return;
            int[][] shortPathTable = new int[9][9];
            int[][] pathMatirx = new int[9][9];
            
            int mgraphN = mgraph.getN();
            int[][] mgraphEdges = mgraph.getEdges();
            
            int v, w, k;
            for (v = 0; v < mgraphN; v++)
            {
                for (w = 0; w < mgraphN; w++)
                {
                    shortPathTable[v][w] = mgraphEdges[v][w];
                    pathMatirx[v][w] = w;
                }
            }
            for (k = 0; k < mgraphN; k++)
            {
                for (v = 0; v < mgraphN; v++)
                {
                    for (w = 0; w < mgraphN; w++)
                    {
                        if (shortPathTable[v][w] > shortPathTable[v][k]
                                + shortPathTable[k][w])
                        {
                            shortPathTable[v][w] = shortPathTable[v][k]
                                    + shortPathTable[k][w];
                            pathMatirx[v][w] = pathMatirx[v][k];
                        }
                    }
                }
            }
             // 显示
            System.out.println("Floyd算法求得最短路径:");
            for (v = 0; v < mgraphN; v++)
            {
                for (w = v + 1; w < mgraphN; w++)
                {
                    System.out.print("v" + v + "->v" + w + "weight:"
                            + shortPathTable[v][w] + "  ");
                    k = pathMatirx[v][w];
                    System.out.print("path:" + v);
                    while (k != w)
                    {
                        System.out.print("->" + k);
                        k = pathMatirx[k][w];
                    }
                    System.out.println("->" + w);
                }
                System.out.println();
            }
        }
    
    }

    测试代码:

    package com.test;
    
    import com.alg.utils.MgraphUtils;
    import com.entity.MGraph;
    
    public class TestGraph
    {
        public static void main(String[] args)
        {
            MGraph mg = new MGraph();  
             
            int[][] array = new int[9][9];  
            for(int i = 0;i < 9; i++)  
                for(int j = 0;j < 9; j++)  
                    array[i][j] = MGraph.NULL;  
            array[0][1] = 1;  
            array[1][0] = 1;  
            array[0][2] = 5;  
            array[2][0] = 5;  
            array[1][2] = 3;  
            array[2][1] = 3;  
            array[1][3] = 7;  
            array[3][1] = 7;  
            array[3][4] = 2;  
            array[4][3] = 2;  
            array[1][4] = 5;  
            array[4][1] = 5;  
            array[2][4] = 1;  
            array[4][2] = 1;  
            array[2][5] = 7;  
            array[5][2] = 7;  
            array[4][5] = 3;  
            array[5][4] = 3;  
            array[3][6] = 3;  
            array[6][3] = 3;  
            array[4][6] = 6;  
            array[6][4] = 6;  
            array[4][7] = 9;  
            array[7][4] = 9;  
            array[5][7] = 5;  
            array[7][5] = 5;  
            array[6][7] = 2;  
            array[7][6] = 2;  
            array[6][8] = 7;  
            array[8][6] = 7;  
            array[7][8] = 4;  
            array[8][7] = 4;  
            MgraphUtils.createMat(mg, array, 9);  
            MgraphUtils.DispMat(mg);  
            MgraphUtils.Dijkstra(mg, 0);
            MgraphUtils.Floyd(mg);
        }
    }
  • 相关阅读:
    单链表的反转是常见的面试题目
    线程状态
    史上最强Android只是总结
    常见的一些算法
    Android LayoutInflater.inflate()使用详解
    Android事件分发机制及滑动冲突解决方案
    Kotlin——高阶函数详解与标准的高阶函数使用
    Kotlin 中的伴生对象和静态成员
    知识点
    Android Studio:多包名打包
  • 原文地址:https://www.cnblogs.com/rixiang/p/4705853.html
Copyright © 2011-2022 走看看