图论——迪杰斯特拉算法(Dijkstra)实现,leetcode
迪杰斯特拉算法(Dijkstra):求一点到另外一点的最短距离
两种实现方法:
邻接矩阵,时间复杂度O(n^2)
邻接表+优先队列,时间复杂度O(mlogn)(适用于稀疏图)
(n:图的节点数,m:图的边数)
leetcode经典例题:
(1)
743. 网络延迟时间
https://leetcode-cn.com/problems/network-delay-time/ 邻接矩阵,时间复杂度O(n^2)
class Solution {
public:
int networkDelayTime(vector<vector<int>>& times, int N, int K) {
vector<int> visit(N,0);
vector<vector<int>> d(N, vector<int>(N,INT_MAX));
for(auto& t:times)
{
d[t[0]-1][t[1]-1] = t[2];
}
if(N==1)
return 0;
int result=-1;
visit[K-1] = 1;
for(int i=0;i<N-1;i++)
{
int k, min_v = INT_MAX;
for(int j=0;j<N;j++)
{;
if(visit[j]==0 && d[K-1][j]<min_v)
{
min_v = d[K-1][j];
k = j;
}
}
if(min_v == INT_MAX)
{
result = -1;
break;
}
if(min_v >result)
result = min_v;
visit[k] = 1;
for(int j=0;j<N;j++)
{
//cout<<"second j:"<<j<<endl;
if(visit[j]==0 && d[k][j]!=INT_MAX)
{
if(d[K-1][j] > d[K-1][k]+d[k][j])
d[K-1][j] = d[K-1][k]+d[k][j];
}
}
}
return result;
}
};
(2)
1514. 概率最大的路径
https://leetcode-cn.com/problems/path-with-maximum-probability/ 邻接表+优先队列,时间复杂度O(mlogn)
class Solution {
public:
double maxProbability(int n, vector<vector<int>>& edges, vector<double>& succProb, int start, int end) {
vector<int> visit(n,0);
vector<vector<pair<double, int>>> neighbor(n);
for(int i=0;i<edges.size();i++)
{
neighbor[edges[i][0]].push_back({succProb[i], edges[i][1]});
neighbor[edges[i][1]].push_back({succProb[i], edges[i][0]});
}
vector<double> d(n,0);
d[start] = 1;
typedef pair<double,int> P;
priority_queue<P, vector<P>, less<P>> q; //最大堆,因为是要求概率值最大,如果是路径最短,应该用最小堆
q.push({1,start});
while(!q.empty())
{
auto t = q.top();
q.pop();
if(visit[t.second] == 1)
continue;
visit[t.second] = 1;
for(auto& i:neighbor[t.second])
{
if(visit[i.second]==0 && d[i.second]< d[t.second]*i.first)
{
d[i.second] = d[t.second]*i.first;
q.push({d[i.second], i.second});
}
}
}
return d[end];
}
};
图论——迪杰斯特拉算法(Dijkstra)实现,leetcode的更多相关文章
- 迪杰斯特拉算法(Dijkstra) (基础dij+堆优化) BY:优少
首先来一段百度百科压压惊... 迪杰斯特拉算法(Dijkstra)是由荷兰计算机科学家狄克斯特拉于1959 年提出的,因此又叫狄克斯特拉算法.是从一个顶点到其余各顶点的最短路径算法,解决的是有权图中最 ...
- C# 迪杰斯特拉算法 Dijkstra
什么也不想说,现在直接上封装的方法: using System; using System.Collections.Concurrent; using System.Collections.Gener ...
- 图->最短路径->单源最短路径(迪杰斯特拉算法Dijkstra)
文字描述 引言:如下图一个交通系统,从A城到B城,有些旅客可能关心途中中转次数最少的路线,有些旅客更关心的是节省交通费用,而对于司机,里程和速度则是更感兴趣的信息.上面这些问题,都可以转化为求图中,两 ...
- 迪杰斯特拉算法dijkstra(可打印最短路径)
#include <iostream> #include <iomanip> #include <string> using namespace std; #def ...
- 图解Dijkstra(迪杰斯特拉)算法+代码实现
简介 Dijkstra(迪杰斯特拉)算法是典型的单源最短路径算法,用于计算一个节点到其他所有节点的最短路径.主要特点是以起始点为中心向外层层扩展,直到扩展到终点为止.Dijkstra算法是很有代表性的 ...
- 迪杰斯特拉(dijkstra)算法的简要理解和c语言实现(源码)
迪杰斯特拉(dijkstra)算法:求最短路径的算法,数据结构课程中学习的内容. 1 . 理解 算法思想::设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合 ...
- 最短路径之迪杰斯特拉(Dijkstra)算法
迪杰斯特拉(Dijkstra)算法主要是针对没有负值的有向图,求解其中的单一起点到其他顶点的最短路径算法.本文主要总结迪杰斯特拉(Dijkstra)算法的原理和算法流程,最后通过程序实现在一个带权值的 ...
- dijkstra算法(迪杰斯特拉算法)
dijkstra算法(迪杰斯特拉算法) 用途:有向图最短路径问题 定义:迪杰斯特拉算法是典型的算法,一般的表述通常有两种方式,这里均采用永久和临时标号的方式,该算法要求图中不存在负权边 用永久和临时标 ...
- 理解最短路径——迪杰斯特拉(dijkstra)算法
原址地址:http://ibupu.link/?id=29 1. 迪杰斯特拉算法简介 迪杰斯特拉(dijkstra)算法是典型的用来解决最短路径的算法,也是很多教程中的范例,由荷兰计算机科 ...
随机推荐
- 21迁移python项目到另一台电脑
在虚拟环境中将第三方库打包到一个TXT文件:1,在项目保存在项目所在目录,文件可以自定义.pip freeze> requirements.txt命令2,将requirements.txt放入另 ...
- Spider_实践_beautifulsoup静态网页爬取所有网页链接
# 获取百度网站首页上的所有a标签里的 href属性值: # import requests # from bs4 import BeautifulSoup # # html = requests.g ...
- leetcode 30day--2
202. Happy Number Write an algorithm to determine if a number n is "happy". A happy number ...
- python + appium 执行报错整理
1.driver.find_element_by_id("com.taobao.taobao:id/searchEdit").send_keys("adidas" ...
- tensorflow的tfrecord操作代码与数据协议规范
tensorflow的数据集可以说是非常重要的部分,我认为人工智能就是数据加算法,数据没处理好哪来的算法? 对此tensorflow有一个专门管理数据集的方式tfrecord·在训练数据时提取图片与标 ...
- ceph扩展bluestore的db分区
前言 在ceph 14版本里面才加入了bluefs-bdev-migrate,分区迁移相关的命令,那么在12版本里面其实也是可以扩展分区的 测试的版本 [root@lab102 ceph-0]# ce ...
- nginx开启目录浏览
使用nginx作为下载站点,开启目录浏览的功能 在/etc/nginx/sites-enabled/default中添加: autoindex on ; autoindex_exact_size of ...
- Spring第二天,你必须知道容器注册组件的几种方式!学废它吊打面试官!
前一篇<不要再说不会Spring了!Spring第一天,学会进大厂!>文章可点击下方链接进行回看. 不要再说不会Spring了!Spring第一天,学会进大厂! 今天将继续讲解Spri ...
- day01-网络基础
一.知识点 1.socket.socket 创建一个 socket,该函数带有两个参数: Address Family:可以选择 AF_INET(用于 Internet 进程间通信) 或者 AF_UN ...
- python-基础入门-7基础
1.语法和语句 Python中有一些基本规则和特殊字符 1)#符号之后的表示注释 2)\n符号表示换行 3)\继续上一行的内容 推荐使用括号,这样可读性更好 4):将两个语句链接在一行中 类似于c语言 ...