zoukankan      html  css  js  c++  java
  • 深搜寻找最短路径

    原创


    寻求图中最短路径的方法有很多,最近刚开始学习,先用深搜实现,用邻接矩阵来存储图。

    直接上图上代码:

    寻求从0~4的最短路径 

    利用深搜找出所有从0~4的路径,一一比较选择出最小的

    import java.util.*;
    
    public class 城市地图 {
        
        static int v;    //顶点
        static int e;    //
        static int matrix[][];    //邻接矩阵
        static int book[];    //标记
        static int min=99999;
        
        static void dfs(int point,int distinct) {
            if(distinct>min) {
                return;
            }
            if(point==v-1) {    //目标点是v-1
                if(distinct<min) {
                    min=distinct;
                    return;
                }
            }
            for(int i=0;i<v;i++) {
                if(matrix[point][i]>0 && matrix[point][i]<99999 && book[i]==0) {
                    book[i]=1;
                    dfs(i,distinct+matrix[point][i]);
                    book[i]=0;    //回溯
                }
            }
            return;
        }
    
        public static void main(String[] args) {
            Scanner reader=new Scanner(System.in);
            v=reader.nextInt();
            e=reader.nextInt();
            matrix=new int[v][v];
            book=new int[v];
            //矩阵初始化
            for(int i=0;i<v;i++) {
                book[i]=0;
                for(int j=0;j<v;j++) {
                    if(i==j) {
                        matrix[i][j]=0;
                    }
                    else {
                        matrix[i][j]=99999;
                    }
                }
            }
            //读入边
            for(int i=0;i<e;i++) {
                int first=reader.nextInt();
                int second=reader.nextInt();
                int dis=reader.nextInt();
                matrix[first][second]=dis;    //有向图
            }
            book[0]=1;    //起始点是0
            dfs(0,0);
            System.out.println(min);
        }
    }

    测试数据:

    输入:

    5 8

    0 1 2

    0 4 10

    1 2 3

    1 4 7

    2 0 4

    2 3 4

    3 4 5

    4 2 3

    输出:9

     无向图代码:

    import java.util.*;
    
    public class 城市地图_无向 {
        
        static int v;
        static int e;
        static int matrix[][];
        static int book[];
        static int min=99999;
        
        static void dfs(int point,int dis) {
            if(dis>min) {
                return;
            }
            if(point==v-1) {    //到达目的地
                if(dis<min) {
                    min=dis;
                }
                return;
            }
            for(int i=0;i<v;i++) {
                if(matrix[point][i]>0 && matrix[point][i]<99999 && book[i]==0) {
                    book[i]=1;
                    dfs(i,dis+matrix[point][i]);
                    book[i]=0;    //回溯
                }
            }
        }
    
        public static void main(String[] args) {
            Scanner reader=new Scanner(System.in);
            v=reader.nextInt();
            e=reader.nextInt();
            matrix=new int[v][v];
            book=new int[v];
            //矩阵初始化
            for(int i=0;i<v;i++) {
                book[i]=0;
                for(int j=0;j<v;j++) {
                    if(i==j) {
                        matrix[i][j]=0;
                    }
                    else {
                        matrix[i][j]=99999;
                    }
                }
            }
            //读入边
            for(int i=0;i<e;i++) {
                int edge_One=reader.nextInt();
                int edge_Two=reader.nextInt();
                int value=reader.nextInt();
                matrix[edge_One][edge_Two]=value;    //无向图
                matrix[edge_Two][edge_One]=value;
            }
            book[0]=1;
            dfs(0,0);
            System.out.println(min);
        }
    
    }

    测试用例:

    输入:

    5 8

    0 1 2

    0 4 10

    1 2 3

    1 4 7

    2 0 4

    2 3 4

    3 4 5

    4 2 3

    输出:7

    23:40:24

    2018-07-23

  • 相关阅读:
    linux 读写文件 open write lseek的API和应用
    gdb 常用命令
    makefile
    c/c++ 动态库与静态库的制作和使用
    linux 常用命令
    c/c++ 网络编程 陈硕老师视频理解之ttcp
    emacs 高亮
    初识HMTL标签
    Java集合基于JDK1.8的ArrayList源码分析
    Java提高篇——equals()与hashCode()方法详解
  • 原文地址:https://www.cnblogs.com/chiweiming/p/9354020.html
Copyright © 2011-2022 走看看