算法题解:求有向图中的最短路径(JAVA+DFS算法实现)

求有向图中的最短路径(JAVA+DFS算法实现)

问题描述

给定一个有向图,如下图所示,求从1号顶点到5号顶点的最短路径。

算法题解:求有向图中的最短路径(JAVA+DFS算法实现)_第1张图片

输入数据格式为第一行输入顶点数和边数,从第二行开始每一行输入3个整数,分别代表连接顶点的边和权重。

例如:1 2 2,表示从1号顶点到2号顶点连接的边,权重为2。

Input: 
5 8 
1 2 2 
1 5 10 
2 3 3 
2 5 7 
3 1 4 
3 4 4 
4 5 5 
5 3 3 
Output: 
9


算法实现

package com.bean.algorithm.graph3;

import java.util.Scanner;

public class ShortestPath {
	static int min = Integer.MAX_VALUE;
    static int[][] edge = new int[100][100];
    static int[] vertex = new int[100];
    static int n, m;
    static Scanner input = new Scanner(System.in);

    public static void main(String[] args) {
        n = input.nextInt();
        m = input.nextInt();
        for (int i = 1; i <= n; i++) {
            for (int j = 1; j <= m; j++) {
                if (i == j) {
                	edge[i][j] = 0;
                } else {
                	edge[i][j] = Integer.MAX_VALUE;
                }
            }
        }
        for (int i = 1; i <= m; i++) {
            int a = input.nextInt();
            int b = input.nextInt();
            int c = input.nextInt();
            edge[a][b] = c;
        }

        vertex[1] = 1;
        dfs(1, 0);
        System.out.println(min);
    }

    public static void dfs(int cur, int dis) {
        /**
         * 如果当前路径大于之前找到的最小值,可直接返回
         * */
        if (dis > min) {
            return;
        }
        /**
         * 判断是否达到最后一个结点,更新最小值,返回
         * */
        if(cur == n) {
            if (dis < min) {
                min = dis;
                return;
            }
        }
        /**
         * 当前点到其他各点之间可连通但是还未添加进来时,遍历执行
         * */
        for (int i = 1; i <= n; i++) {
            if (edge[cur][i] != Integer.MAX_VALUE && vertex[i] == 0) {
            	vertex[i] = 1;
                dfs(i, dis+edge[cur][i]);
                /**
                 * 回溯
                 **/
                vertex[i] = 0;
            }
        }
        return;
    }

}

程序运行结果:

9

 

你可能感兴趣的:(算法分析与设计,算法分析与设计,JAVA算法设计,有向图求最短路径,DFS算法)