• 743. 网络延迟时间 力扣(中等) 最短路径SPFA,不熟练


    743. 网络延迟时间

    有 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

    题源:(点击题目)

    题解:

    最短路径,开始做成了bfs的遍历,因为路径上是有权重的,所以应该是最短路径(dijkstra,SPFA, Floyed……),我采用的是SPFA

    注意点,对于结果,不能在做的过程中得道,因为距离数组dis[]还会不停更新。

    代码1: SPFA没有用vis数组优化

    class Solution {
    public:
        
        int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        map<int , vector<pair<int,int>> > mp;
        queue<int> Q;
        for(auto i: times)
            mp[i[0]].push_back(make_pair(i[1],i[2]));
        
        int dis[105];
        memset(dis,-1,sizeof(dis));
    
         dis[k]=0;
         Q.push(k);
         int maxti=0;
         while(!Q.empty())
         {
             int p=Q.front();
             Q.pop();
             for(auto i:mp[p])
             {
                 if(dis[i.first]>=0 && i.second+dis[p]>=dis[i.first])  continue;
                 dis[i.first]=i.second+dis[p];
                 Q.push(i.first);
                // maxti=max(maxti,dis[i.first]);   //不能在这个位置比较,因为此时dis[]并不是最短的时间
             }
         }
         for(int i=1;i<=n;i++)
           if (dis[i]<0) return -1;
              else maxti=max(maxti,dis[i]);  // 需要在这个位置进行比较
         return maxti;
        }
    };

    代码2:SPFA方法

    class Solution {
    public:
        
        int networkDelayTime(vector<vector<int>>& times, int n, int k) {
        map<int , vector<pair<int,int>> > mp;
        queue<int> Q;
        for(auto i: times)   mp[i[0]].push_back(make_pair(i[1],i[2]));   // 构建一个自己的图
        
        int dis[105];
        memset(dis,-1,sizeof(dis));  // 表示该节点是否被访问过,并存被访问最短时间
        bool vis[105];
        memset(vis,0,sizeof(vis));  // 表示是否在Q队列中
    
         dis[k]=0;
         vis[k]=1;
         Q.push(k);
         int maxti=0;
         while(!Q.empty())
         {
             int p=Q.front();
             Q.pop();
             vis[p]=0;
             for(auto i:mp[p])
             {
                 if(dis[i.first]>=0 && i.second+dis[p]>=dis[i.first])  continue;
                 dis[i.first]=i.second+dis[p];  // 不在队列或队列中,都要被更新
                 if (!vis[i.first])  // 如果不在队列中,放入队列
                 {
                       Q.push(i.first);
                       vis[i.first]=1;
                 }
             }
         }
         for(int i=1;i<=n;i++)
           if (dis[i]<0) return -1;
              else maxti=max(maxti,dis[i]); 
         return maxti;
        }
    };

  • 相关阅读:
    ASPNET5应用程序启动
    DNX概述
    MySQL数据库管理员密码忘记如何修改?
    Rsync数据复制软件应用
    Centos7系统中Mysql数据库的安装
    基于Haproxy+Keepalived实现Haproxy的高可用
    源码编译安装Mariadb数据库的时候报错,/usr/bin/c++ doesn't support -std=c++11 or -std=c++0x, you need one that does.
    mariadb数据库的安装
    更改Ubuntu和Centos系统中的镜像源
    快速搭建ELK日志分析系统
  • 原文地址:https://www.cnblogs.com/stepping/p/15090111.html
Copyright © 2020-2023  润新知