力扣刷题743:最短路径求网络延迟时间c++
解题思路核心思路还是贪心算法,先求局部最优,源点到第一个节点的最短路径,依次求下一个节点的最短路径1.用二维数组遍历存储邻接结点边信息2.定义结点到源点的距离数组3.从源点出发第一遍遍历找源点的第一个最近节点4.找到一个节点后找这个节点的下一个最近节点class Solution {public:int networkDelayTime(vector<vector<int>>
·
解题思路
核心思路还是贪心算法,先求局部最优,源点到第一个节点的最短路径,依次求下一个节点的最短路径
1.用二维数组遍历存储邻接结点边信息
2.定义结点到源点的距离数组
3.从源点出发第一遍遍历找源点的第一个最近节点
4.找到一个节点后找这个节点的下一个最近节点
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int n, int k) {
const int inf = INT_MAX / 2;//更新距离时,有两数相加,为了防止溢出所以除以2
//1.存储邻接结点边信息,n是vector的数量,c是初始化填入的值
vector<vector<int>> g(n,vector<int>(n,inf));
for(auto &t: times) //遍历times列表,得到源节点到各节点时间值的一个二维数组
{
//序号从0开始
int x = t[0] - 1; //times[i]中起点的节点
int y = t[1] - 1; //times[i]中终点的节点
g[x][y] = t[2]; //times[i]中起点到终点的时间
}
//2.结点到源点的距离数组
vector<int> dist(n,inf); //从结点到源点的距离数组,初始化为无穷大
dist[k - 1] = 0; // 由于从 k 开始,所以该点距离设为 0,也即源点
vector<bool> used(n);//节点是否被更新过
//3.从源点出发第一遍遍历找源点的下一个最近节点
for(int i = 0;i < n; i++)//遍历所有的节点
{
int x = -1;// 用来标志有没有找到下一个节点,没有就是-1;找到的话标号就是x
for(int y = 0;y < n;y++) //遍历下一个节点
{
if(!used[y] && (x == -1 || dist[y] < dist[x])) //y节点没有被更新过 && 还没有找到 ||找到的小于当前的
{
x = y;//找到后用x表示下一个节点
}
}
//4.找到一个节点后找这个节点的下一个最近节点
used[x] = true;//确定下一个节点
for(int y = 0; y < n;++y){ //在未确定的节点中,继续寻找下一个节点,节点没有顺序,每次都要从0开始找
dist[y] = min(dist[y],dist[x]+g[x][y]);//更新该点到源点的最短路径,具体为比较源点到y和源点到x再到y
}
}
//5.返回
int ans = *max_element(dist.begin(),dist.end());//max_element查询最大值所在的地址,*表示返回的是值
return ans == inf ? -1 : ans;//如果返回的是information,则表示不能到达
}
};
更多推荐
所有评论(0)