Dijkstra 迪杰斯特拉 最短路径问题

解题思路

Dijkstra    迪杰斯特拉

描述的是特定点到所有节点的最短距离 dst
每次找出距离 本阶段最近的节点 can_node 
遍历can_node 的子节 更新 距离列表 

代码

class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
       //Dijkstra    迪杰斯特拉

    //    描述的是特定点到所有节点的最短距离 dst
    //    每次找出距离 本阶段最近的节点 can_node 
    //    遍历can_node 的子节 更新 距离列表  
   

    // 1. 边图转邻接表
         std::unordered_map<int, std::unordered_map<int,int>  > graph;
        for(const auto & t: times )
        {
            graph[t[0]].emplace(t[1],t[2]);
        }
    // 2.while
       std::vector<int> dist(n+1,INT_MAX);
       dist[k] = 0;
       std::vector<int> visited(n+1,0);
       while(1)
       {
           //canval , argcan= min(dist)
           
           int canNode= -1;
           int canDist = INT_MAX;
 
           for(int i=1;i<=n;i++)
           {
                if(visited[i]==0 &&  dist[i]<canDist) 
                {
                    canNode= i; 
                    canDist = dist[i];
                } 
           }


           // std::cout << canNode << std::endl;
            if(-1== canNode ) break; 
             visited[canNode] =1;
             
            
        //    if not find argcan  break;
        
           //update children
          // for child in argcan.children:
            //   dist[child]= min(   dist[child] , dist[can_node] + val)

            for(const auto & child : graph[canNode])
            {
                  
                if( dist[child.first] > dist[canNode] + child.second  ) dist[child.first] = dist[canNode] + child.second;
            }

       }
        
    //    for(auto x: dist) std::cout << x << " ";
    //    std::cout << std::endl;

          int tmp= *std::max_element(dist.begin()+1,dist.end() );
         if(tmp==INT_MAX ) return -1;
          else return tmp;
     
       
       

        
    }
};

题目描述

有 n 个网络节点,标记为 1 到 n。

给你一个列表 times,表示信号经过 有向 边的传递时间。 times[i] = (ui, vi, wi),其中 ui 是源节点,vi 是目标节点, wi 是一个信号从源节点传递到目标节点的时间。

现在,从某个节点 K 发出一个信号。需要多久才能使所有节点都收到信号?如果不能使所有节点收到信号,返回 -1 。

示例 1:

输入:times = [[2,1,1],[2,3,1],[3,4,1]], n = 4, k = 2
输出:2
示例 2:

输入:times = [[1,2,1]], n = 2, k = 1
输出:1
示例 3:

输入:times = [[1,2,1]], n = 2, k = 2
输出:-1

提示:

1 <= k <= n <= 100
1 <= times.length <= 6000
times[i].length == 3
1 <= ui, vi <= n
ui != vi
0 <= wi <= 100
所有 (ui, vi) 对都 互不相同(即,不含重复边)

来源:力扣(LeetCode)
链接:https://leetcode-cn.com/problems/network-delay-time
著作权归领扣网络所有。商业转载请联系官方授权,非商业转载请注明出处。

posted @ 2021-05-19 17:08  boyang987  阅读(87)  评论(0编辑  收藏  举报