首页 > 其他分享 >(nice!!!)LeetCode 3112. 访问消失节点的最少时间(图论、边的dijkstra、堆优化)

(nice!!!)LeetCode 3112. 访问消失节点的最少时间(图论、边的dijkstra、堆优化)

时间:2024-07-18 12:30:11浏览次数:15  
标签:tmp vector qu second 3112 LeetCode dijkstra edges 节点

3112. 访问消失节点的最少时间

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

思路:节点n的个数非常大,用普通的dijkstra算法对节点进行枚举是会超时的,时间复杂度为0(n^2)。这里边的数量最大为10 ^5,可以对边使用dijkstra算法+堆优化操作,时间复杂度为0(mlogm)。

节点消失问题,只需要加一个判断条件,判断到每个节点的最小时间是否都低于消失时间,如果不低于说明到不了,直接跳过即可。细节看注释。

class Solution {
public:
    typedef pair<int,int> PII;
    vector<int> minimumTime(int n, vector<vector<int>>& edges, vector<int>& disappear) {
    	//邻接表
        vector<vector<PII>> g(n);
        for(int i=0;i<edges.size();i++){
            g[edges[i][0]].push_back({edges[i][1],edges[i][2]});
            g[edges[i][1]].push_back({edges[i][0],edges[i][2]});
        }
        //到每个节点的最小值,-1表示还没到过
        vector<int> dis(n,-1);
        //按最小时间进行升序排列的优先队列
        priority_queue<PII,vector<PII>,greater<PII>> qu;
        //插入0节点的情况
        qu.push({0,0});
        while(qu.size()){
            PII tmp=qu.top();
            qu.pop();
            //如果当前节点没有遍历过,或者有更小的时间到达
            if(dis[tmp.second]==-1||tmp.first<dis[tmp.second]){
                dis[tmp.second]=tmp.first;
            }else{
                continue;
            }
            //枚举当前点tmp.second能到的其他节点
            for(int i=0;i<g[tmp.second].size();i++){
            //如果可以在消失前到达,那就加入队列
            if(g[tmp.second][i].second+tmp.first<disappear[g[tmp.second][i].first]) 
                qu.push({g[tmp.second][i].second+tmp.first,g[tmp.second][i].first});
            }
        }
        return dis;
    }
};

标签:tmp,vector,qu,second,3112,LeetCode,dijkstra,edges,节点
From: https://blog.csdn.net/weixin_46028214/article/details/140519561

相关文章

  • [leetcode] 字符串 重复的子字符串
    题目:给定一个非空的字符串s,检查是否可以通过由它的一个子串重复多次构成。代码:思路1(暴力算法):省略思路2(移动匹配):两个重复的字符串,肯定能组成一个新的s代码boolrepeatedSubstringPattern(strings){strings1=s+s;s1.erase(s1.begin());......
  • 【LeetCode 0051】【剪枝】N皇后
    N-QueensThen-queenspuzzleistheproblemofplacingnqueensonannxnchessboardsuchthatnotwoqueensattackeachother.Givenanintegern,returnalldistinctsolutionstothen-queenspuzzle.Youmayreturntheanswerinanyorder.Eachsolu......
  • leetcode_189. 轮转数组
    leetcode_189.轮转数组题目描述:给定一个整数数组nums,将数组中的元素向右轮转k个位置,其中k是非负数。示例1:输入:nums=[1,2,3,4,5,6,7],k=3输出:[5,6,7,1,2,3,4]解释:向右轮转1步:[7,1,2,3,4,5,6]向右轮转2步:[6,7,1,2,3,4,5]向右轮转3步:[......
  • LeetCode-环形链表、环形链表 II
    一、环形链表.-力扣(LeetCode)判断是否有环,使用快慢指针,开始时都指向头节点,快指针每次走两部,慢指针每次走一步,如果在走的过程中,慢指针和快指针相同(也就是快指针和慢指针指向的节点的同)那么就说明这个链表是带环链表;原理: 若是这个链表代换,那么快慢指针一定不会走向NULL;只......
  • LeetCode - #97 交错字符串
    文章目录前言1.描述2.示例3.答案关于我们前言本题由于没有合适答案为以往遗留问题,最近有时间将以往遗留问题一一完善。我们社区陆续会将顾毅(Netflix增长黑客,《iOS面试之道》作者,ACE职业健身教练。)的Swift算法题题解整理为文字版以方便大家学习与阅读。......
  • LeetCode-计数质数
    计数质数给定整数n,返回所有小于非负整数n的质数的数量。示例1:输入:n=10输出:4解释:小于10的质数一共有4个,它们是2,3,5,7。示例2:输入:n=0输出:0示例3:输入:n=1输出:0......
  • leetcode145. 二叉树的后序遍历,递归法+迭代法,全过程图解+步步解析,一点点教会你迭代法
    leetcode145.二叉树的后序遍历,递归法+迭代法给你一棵二叉树的根节点root,返回其节点值的后序遍历。示例1:输入:root=[1,null,2,3]输出:[3,2,1]示例2:输入:root=[]输出:[]示例3:输入:root=[1]输出:[1]递归法还是一如既往的简单。postorder函数是递归函数,用......
  • LeetCode第257题:二叉树的所有路径的Java实现
    摘要LeetCode第257题要求生成二叉树的所有从根节点到叶子节点的路径。本文将介绍两种Java解决方案:迭代法和递归法。1.问题描述给定一个二叉树的根节点,按照从根到叶的顺序遍历所有路径,并将它们作为列表的列表返回。2.示例分析输入:[1,2,3,null,null,4]'输出:[[1,2],[1,......
  • LeetCode 2263. Make Array Non-decreasing or Non-increasing
    原题链接在这里:https://leetcode.com/problems/make-array-non-decreasing-or-non-increasing/description/题目:Youaregivena 0-indexed integerarray nums.Inoneoperation,youcan:Chooseanindex i intherange 0<=i<nums.lengthSet nums[i] to num......
  • LeetCode算法笔记5
    题目描述给你一个字符串 s,找到 s 中最长的 回文子串示例1:输入:s="babad"输出:"bab"解释:"aba"同样是符合题意的答案。示例2:输入:s="cbbd"输出:"bb"提示:1<=s.length<=1000s 仅由数字和英文字母组成解法:classSolution:deflongestPalindrome(sel......