2021-07-31 Disjkstra

在这里插入图片描述

分析:从k结点传输到所有结点的时间 = max(k到1结点所需最短时间,k到2结点所需最短时间…从k到n所需最短时间),因为传输是同时的,所以这道题就转换为图的最短路径问题

先用Disjkstra算法求出各个点到k的最短距离,然后求出这些距离中的最大值

int networkDelayTime(vector<vector<int>>& times, int n, int k){
    queue<int> myQue;  //此队列用于即将访问的结点
    vector<int> distTok(n + 1, INT_MAX); //数组distTok表示k到点index的最短距离
    vector<vector<int> > graph(n + 1, vector<int>(N + 1, -1));  //邻接矩阵
    
    for(auto &time : times){
        //构建邻接矩阵
        graph[time[0]][time[1]] = time[2];
    }
    
    myQue.push(k);
    distTok[k] = 0;   //k到自己的距离为0
    
    //开始搜索各个点到k的最短距离
    while(!myQue.empty()){
        int front = myQue.front();
        myQue.pop();
        
        //利用当前front结点,尝试结点k到所有结点的最短距离
        for(int target = 1; target <= N; ++target){
            if(graph[front][target] != -1 && distTok[front] + graph[front][target] < distTok[target]){
                distTok[target] = distTok[front] + graph[front][target];
                myQue.push(target);
            }
        }
    }
    
    //寻找点k到各个点的最短距离的最大值
    int maxRes = 0;
    for(int i = 1; i <= N; i++){
        maxRes = max(maxRes, distTok[i]);
    }
    
    return maxRes == INT_MAX? -1 : maxRes;
    
}

int mai
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值