第一次发博客,主要目的还是当笔记用吧
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;
}