leetCode刷题记录

 第一次发博客,主要目的还是当笔记用吧

lettCode2039题

题目大致要求是给一张图,两两节点之间的连接长度为1.要我们求出从一个节点到其他节点的所有距离。着我首先想到的是迪杰斯塔拉的,但是这个时间复杂度是n^2的,所以最后超时了。标准题解是用的BFS。大致思路是从源点开始,一层层的遍历所有的节点。第i层的节点到源点的距离就是i。这样找出所有节点到源点的距离。然后根据这个距离算出题目中要求的“最短时间"

主要过程有两步骤

1、将题目给出的边转换成邻接表(以二维数组的形式,用vector<vector<int>>实现)

2、bfs遍历

代码如下,感觉还是蛮精妙的

但我还有一个疑惑,就是这个算法其实是没法保证每个点到源点的路径是最短的。但题目标准解法给出这个。我也没办法。可能题目给出的图有点特殊吧。

#include <iostream>

#include <algorithm>

#include <string>

#include <vector>

#include <queue>

using namespace std;

class Solution {

public:

   

    int networkBecomesIdle(vector<vector<int>>& edges, vector<int>& patience) {

        //初始化一张邻接表

        int n = patience.size(),res = 0;

        vector<vector<int>> table(n);

        for(auto &e : edges){

            table[e[0]].emplace_back(e[1]);

            table[e[1]].emplace_back(e[0]);

        }

        //BFS寻路

        vector<bool> visit(n, false);

        queue<int> qu;

        qu.emplace(0);

        visit[0] = true;

        int dist = 1;//dist依次增大,找出距离源点距离为dist的所有邻节点

        while (!qu.empty())

        {

            int sz = qu.size();//已经访问过的点的个数

            //这一轮找到的点与0点的距离为dist

            for(int i = 0; i < sz; i++){

                int cur = qu.front();

                qu.pop();

                for(auto &v: table[cur]){

                    if(visit[v]){

                        continue;

                    }

                    qu.emplace(v);

                    int time = patience[v] * ((2 * dist - 1) / patience[v]) + 2 * dist + 1;

                    res = max(res, time);

                    visit[v] = true;

                }

            }

            dist++;

        }

        return res;

       

    }

};

int main(){

    vector<vector<int>> edges{{0, 1}, {0, 2}, {1, 2}};

    vector<int>patience{0, 10, 10};

    cout << Solution().networkBecomesIdle(edges, patience);

    return 0;

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值