欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

深搜寻找最短路径

程序员文章站 2022-07-05 11:10:43
原创 寻求图中最短路径的方法有很多,最近刚开始学习,先用深搜实现,用邻接矩阵来存储图。 直接上图上代码: 寻求从0~4的最短路径 利用深搜找出所有从0~4的路径,一一比较选择出最小的 测试数据: 输入: 5 8 0 1 2 0 4 10 1 2 3 1 4 7 2 0 4 2 3 4 3 4 5 4 ......

原创


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

直接上图上代码:

深搜寻找最短路径

寻求从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