数据结构与算法笔记--图最短路径

171 阅读2分钟

图(最短路径算法)

关键词:图、最短路径

应用场景:

图论中求最短路径的场景 常用算法:

  1. BFS | DFS
  2. Folyd
  3. Dijkstra
  4. Bellman-Ford
  5. spfa
  6. A*
  7. ... 由于技术有限,本文先针对lc743介绍BFSFolydDijkstraBellman-Ford在求最短路径问题时的基本用法:

题目描述

题目🔗: leetcode-cn.com/problems/ne… lc743

Folyd算法

	public int networkDelayTime(int[][] times, int n, int k) {
        final int INF = 1_000_000;
        int[][] matrix = new int[n][n];
        for (int i=0;i<n;i++){
            Arrays.fill(matrix[i],INF);
        }
        for (int[] edge:times){
            matrix[edge[0]][edge[1]] = edge[2];
        }
        for (int i=0;i<n;i++){
            for (int j=0;j<n;j++){
                for (int l=0;l<n;l++) {
                    if (matrix[j][l] > matrix[j][i]+matrix[i][l]) {
                        matrix[j][l] = matrix[j][i]+matrix[i][l];
                    }
                }
            }
        }
        int v = Arrays.stream(matrix[k]).max().getAsInt();
        return v == INF ? -1:v;
    }

Dijkstra 算法

	final int INF = 1_000_00;
    /**
     * @method dijkstra 算法 传统解法 未使用队列优化
     * @param times
     * @param n
     * @param k
     * @return
     */
    public int networkDelayTime_Dijkstra(int[][] times, int n, int k) {

        int[][] matrix = new int[n][n];
        for (int i=0;i<n;i++){
            Arrays.fill(matrix[i],INF);
            matrix[i][i] = 0;
        }
        for (int[] edge:times) {
            matrix[edge[0]-1][edge[1]-1] = edge[2];
        }
        // dijkstra 算单源最短路径
        int[] dis = dijkstra(matrix,k-1);
        int v = Arrays.stream(dis).max().getAsInt();
        return v == INF ? -1:v;
    }

    private int[] dijkstra(int[][] matrix,int src) {
        int n = matrix.length;
        int[] res = Arrays.copyOf(matrix[src],n);
        int[] seen = new int[n];
        seen[src] = 1;
        //
        int idx = -1;
        for (int k=0;k<n;k++) {
         int min = INF;
            for (int i=0;i<n;i++) {
                if (seen[i] == 0 && res[i] <= min) {
                    min = res[i];
                    idx = i;
                }
            }
            // 用idx更新其他
            seen[idx] = 1;
            for (int j=0;j<n;j++) {
                if (res[idx]+matrix[idx][j] < res[j]) {
                    res[j] = res[idx]+matrix[idx][j];
                }
            }
        }
        return res;
    }

BF 解法

 public int networkDelayTime(int[][] times, int N, int K) {
       int[] distance = new int[N];
       Arrays.fill(distance,-1);
       distance[K-1] = 0;
       // BF算法
       for(int i=1;i<=N-1;i++){
           // 进行N-1轮松弛
           for(int[] edge:times)
               // 枚举每一条边
               if(distance[edge[0]-1]!=-1){
                   if(distance[edge[1]-1]==-1){
                       distance[edge[1]-1] = distance[edge[0]-1]+edge[2];
                   }else{
                       distance[edge[1]-1] = Math.min(distance[edge[1]-1],distance[edge[0]-1]+edge[2]);
                   }
               }
       }
       int max = 0;
       for(int t:distance){
           if(t==-1) return -1;
           max = Math.max(max,t);
       }
       return max;
   }