力扣(LeetCode) 【每日一题】 743.网络延迟时间 2021.8.2

题目链接:

743.网络延迟时间

不想戳的看下图:

在这里插入图片描述

示例:

在这里插入图片描述

提示:

在这里插入图片描述

解题思路1:

Dijkstra算法(邻接矩阵)

1.将输入的数组转换为一个图,用邻接矩阵表示
dijsktra
2.使用dijsktra算法,求出到所有其他顶点的最短路径和
使用dist来保存最短路径和
3.求出dist里的最大值,即是答案,因为题目要求到达所有点,那么dist里最大值就是答案
如果dist里有初始化的Integer.MAX_VALUE那么说明这点不可达,返回-1
复杂度O(n^2)

代码如下:

class Solution {
    public int networkDelayTime(int[][] times, int n, int k) {
        int[][] adjustMatrix = buildGraph(times,n);

        int ans = 0;
        int[] dist = dijsktra(adjustMatrix,n,k);
        for (int i = 0; i < n; i++) {
            ans = Math.max(ans,dist[i]);
        }
        return ans==Integer.MAX_VALUE?-1:ans;
    }

    private int[] dijsktra(int[][] adjMat,int n,int k){
        boolean[] visited = new boolean[n];
        int[] dist = new int[n];
        for (int i = 0; i < n; i++) {
            dist[i] = Integer.MAX_VALUE;
        }
        dist[k-1] = 0;
        for (int i = 0; i < n; i++) {
            int src = minDistance(dist,n,visited);
            visited[src] = true;
            for (int dst = 0; dst < n; dst++) {
                int toDstDis = dist[src] + adjMat[src][dst];
                if(!visited[dst] && adjMat[src][dst]!=Integer.MIN_VALUE &&
                     dist[src]!=Integer.MAX_VALUE &&
                        toDstDis<dist[dst]){
                    dist[dst] = toDstDis;
                }
            }
        }

        return dist;
    }

    //有向带权图的邻接矩阵
    private int[][] buildGraph(int[][] times,int n){
        int[][] adjustMatrix = new int[n][n];
        for (int i = 0; i < adjustMatrix.length; i++) {
            Arrays.fill(adjustMatrix[i],Integer.MIN_VALUE);
        }
        for (int i = 0; i < times.length; i++) {
            adjustMatrix[times[i][0]-1][times[i][1]-1] = times[i][2];
        }
        return adjustMatrix;
    }

    private int minDistance(int dist[], int n,boolean visited[]) {
        int min = Integer.MAX_VALUE, minIndex = -1;
        for (int v = 0; v < n; v++) {
            if (visited[v] == false && dist[v] <= min) {
                min = dist[v];
                minIndex = v;
            }
        }
        return minIndex;
    }
}
//代码较长,自行理解

解题思路2:

Dijkstra 优先队列(堆优化)

解题思路3:

广度优先搜索

解题思路4:

SPFA

注:因篇幅有限,以上几种算法留给同学们自行拓展。

小结

这题其实就是关于图的最短路径算法。解题方法多种多样,同学们可以根据喜好自行选择。

如果都会就更好了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值