计算两点间次短距离

题目来源:

https://leetcode-cn.com/problems/second-minimum-time-to-reach-destination/


思路: 用两个距离数组,记录出发点到各点的距离

其中dis[i][0] 记录最短距离,dis[i][1]记录(严格)次短距离
同时维护dis[i][0]和dis[i][1]即可

如何维护?

我们从队列中取到一个点时,先判断他是否已经计算出次短距离了,如果是就直接抛弃, 然后判断如果他已经被访问过一次(既,已经计算出最短距离) , 判断它的最短距离和当前距离是否相同,相同则不符合严格短的定义,也抛弃

通过上述过滤后,就可以得到正常进行更新的节点了!

class Solution {
public:
struct node{
int p,t;
};
vector<int> G[10010];
map<int,int> vis;
int dis[10010][2];

    int secondMinimum(int n, vector<vector<int>>& edges, int time, int change) {
        memset(dis,-1,sizeof(dis));

        for(auto &it:edges){
            G[it[0]].push_back(it[1]);
            G[it[1]].push_back(it[0]);
        }

        queue<node> q;
        q.push((node){1,0});

        while(q.size()){
            auto ft=q.front();
            q.pop();

            if(vis[ft.p]>=2) 
            // 这个点已经被访问过两次了,可以被抛弃
            continue ;
            if(vis[ft.p]==1&&dis[ft.p][0]==ft.t) 
            // 只访问了一次,但当前拿到的点不是严格第二小点
            continue ;

            // 记录该点的dis,访问次数
            dis[ft.p][vis[ft.p]++]=ft.t;            

            // 将该点的邻居节点入队
            for(auto it:G[ft.p])  q.push((node){it,ft.t+1});
        }

        // 计算时间
        int t=dis[n][1];
        
        int ans=0;
        while(--t){
            ans+=time;
            if((ans/change)%2){
                ans+=(change-ans%change);
            }
        }

        return ans+time;
    }
};
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值