zoukankan      html  css  js  c++  java
  • 深度优先算法解决有向有权图的最短路径问题

    从城市1到城市到城市3有很多条路,每条路的路况各不相同,所耗费的时间都标记在了箭头上,现在需要找出从1到3的最短路径。

    有向图:意思是来回的路径值可以是不一样的

    有权图:意思是每套路径的值可以是不一样的

    package myalgorithm;
    public class ShortPath {
        /*全局最短路径*/
        public int stepnum = 999;
        /*构建4*4路径图,-1表示此路不通*/
        int[][] graph = {
                {0 ,2 ,6 ,4},
                {-1,0 ,3 ,-1},
                {7 ,-1,0 ,1},
                {5 ,-1,12,0}
        };
        /*初始标记数组都为0*/
        public int[] mark = new int[graph.length];
       
        /*采用递归的DFS算法*/
        public void DFS(int cur, int length) {
            /*还没到3号车站,路径就已经够长了*/
            if (length>stepnum)
            {
                return;
            }
            /*到达目的地3号车站*/
            if (cur == 2)
            {
                if(length < stepnum)
                {
                    stepnum = length;
                }
                return;//找到之后立即返回,不再继续
            }
    
            //到下一个车站,需要遍历所有的车站,看看那个车站没有走过并且路是通的
            for(int i=0;i<4;i++)
            {
                if(graph[cur][i] != -1 
                        && mark[i] == 0)
                {
                    mark[i] = 1;//标记该点已经走过
                    DFS(i,length+graph[cur][i]);
                    mark[i] = 0;//取消该点的标记
                }
            }
            return;
        }
       public static void main(String[] args) {
            ShortPath my = new ShortPath();
            long start1 = System.currentTimeMillis();
            my.mark[0]= 1;
            my.DFS(0,0);
            long end1 = System.currentTimeMillis();
            System.out.println("DFS step: " + my.stepnum + " time:" + (end1-start1));
        }
    
    }
  • 相关阅读:
    AVLTree的实现以及左右旋转维持自平衡
    哈希函数之布隆过滤器
    LeetCode——线段树解决区间总和问题
    第23章 Windows身份验证
    第22章 使用外部身份提供商登录
    第21章 登录
    第20章 定义客户端
    第19章 定义资源
    第18章 启动
    第17章 社区快速入门和模板
  • 原文地址:https://www.cnblogs.com/mingziday/p/4851830.html
Copyright © 2011-2022 走看看