力扣刷题743:最短路径求网络延迟时间c++

解题思路

核心思路还是贪心算法,先求局部最优,源点到第一个节点的最短路径,依次求下一个节点的最短路径

1.用二维数组遍历存储邻接结点边信息
2.定义结点到源点的距离数组
3.从源点出发第一遍遍历找源点的第一个最近节点
4.找到一个节点后找这个节点的下一个最近节点
class Solution {
public:
    int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        const int inf = INT_MAX / 2;//更新距离时,有两数相加,为了防止溢出所以除以2

        
        //1.存储邻接结点边信息,n是vector的数量,c是初始化填入的值

        vector<vector<int>> g(n,vector<int>(n,inf));
        for(auto &t: times)     //遍历times列表,得到源节点到各节点时间值的一个二维数组
        {
            //序号从0开始
            int x = t[0] - 1;  //times[i]中起点的节点
            int y = t[1] - 1;  //times[i]中终点的节点
            g[x][y] = t[2];    //times[i]中起点到终点的时间
        }

        //2.结点到源点的距离数组
        vector<int> dist(n,inf); //从结点到源点的距离数组,初始化为无穷大
        dist[k - 1] = 0;  // 由于从 k 开始,所以该点距离设为 0,也即源点
        vector<bool> used(n);//节点是否被更新过

        //3.从源点出发第一遍遍历找源点的下一个最近节点

       for(int i = 0;i < n; i++)//遍历所有的节点
       { 
           int x = -1;// 用来标志有没有找到下一个节点,没有就是-1;找到的话标号就是x
           for(int y = 0;y < n;y++) //遍历下一个节点
           {
               if(!used[y] && (x == -1 || dist[y] < dist[x])) //y节点没有被更新过 && 还没有找到 ||找到的小于当前的
               {
                   x = y;//找到后用x表示下一个节点
               }
           }
        //4.找到一个节点后找这个节点的下一个最近节点
           used[x] = true;//确定下一个节点
           for(int y = 0; y < n;++y){   //在未确定的节点中,继续寻找下一个节点,节点没有顺序,每次都要从0开始找
            dist[y] = min(dist[y],dist[x]+g[x][y]);//更新该点到源点的最短路径,具体为比较源点到y和源点到x再到y
           }
       }
       //5.返回
       int ans = *max_element(dist.begin(),dist.end());//max_element查询最大值所在的地址,*表示返回的是值
       return ans == inf ? -1 : ans;//如果返回的是information,则表示不能到达
    }
};
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值