IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Dijkstra求单源最短路径C++代码模板 -> 正文阅读

[C++知识库]Dijkstra求单源最短路径C++代码模板

在写出具体函数之前,需要先定义MAXV为最大顶点数、INF为一个很大的数字:

const int MAXV = 1000;//最大顶点数
const int INF = 1000000000;//设INF是一个很大的数

邻接矩阵版

int n, G[MAXV][MAXV];//n为顶点数,MAXV为最大顶点数
int d[MAXV];//起点到达各点的最短路径长度
bool vis[MAXV] = { false };//标记数组,vis[i]=true表示已访问。初值均为false

void Dijkstra(int s) {//s为起点
	fill(d, d + MAXV, INF);//fill函数将整个数组d赋为INF
	d[s] = 0;//起点s到达自身的距离为0
	for (int i = 0; i < n; i++) {//循环n次
		int u = -1, MIN = INF;//u使d[u]最小,MIN存放该最小的d[u]
		for (int j = 0; j < n; j++) {//找到未访问的顶点中d[]最小的
			if (vis[j] == false && d[j] < MIN) {
				MIN = d[j];
				u = j;
			}
		}
		//找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		if (u == -1) return;
		vis[u] = true;//标记u已访问
		for (int v = 0; v < n; v++) {
			//如果v未访问&&u能到达v&&以u为中介点可以使d[v]更优
			if (vis[v] == false && G[u][v] != INF && d[u] + G[u][v] < d[v]) {
				d[v] = d[u] + G[u][v];//优化d[v]
			}
		}
	}
}

从复杂度来看,主要是外层循环 O ( V ) O(V) O(V)(V就是顶点个数n)与内层循环(寻找最小的d[u]需要 O ( V ) O(V) O(V)、枚举v需要 O ( V ) O(V) O(V)产生的,总复杂度为 O ( V ? ( V + V ) ) = O ( V 2 ) O(V*(V+V))=O(V^2) O(V?(V+V))=O(V2)

邻接表版

struct Node
{
	int v, dis;//v为边的目标顶点,dis为边权
};

vector<Node> Adj[MAXV];//图G,Adj[u]存放从顶点u出发可以到达的所有顶点,MAXV为最大顶点数
int n;//n为顶点数
int d[MAXV];//起点到达各点的最短路径长度
bool vis[MAXV] = { false };//标记数组,vis[i]=true表示已访问。初值均为false

void Dijkstra(int s) {//s为起点
	fill(d, d + MAXV, INF);//fill函数将整个数组d赋为INF
	d[s] = 0;//起点s到达自身的距离为0
	for (int i = 0; i < n; i++) {//循环n次
		int u = -1, MIN = INF;//u使d[u]最小,MIN存放该最小的d[u]
		for (int j = 0; j < n; j++) {//找到未访问的顶点中d[]最小的
			if (vis[j] == false && d[j] < MIN) {
				MIN = d[j];
				u = j;
			}
		}
		//找不到小于INF的d[u],说明剩下的顶点和起点s不连通
		if (u == -1) return;
		vis[u] = true;//标记u已访问
		//只有下面这个for与邻接矩阵的写法不同
		for (int j = 0; j < Adj[u].size(); j++) {
			int v = Adj[u][j].v;//通过邻接表直接获得u能到达的顶点v
			//如果v未访问&&以u为中介点可以使d[v]更优
			if (vis[v] == false && d[u] + Adj[u][v].dis < d[v]) {
				d[v] = d[u] + Adj[u][v].dis;//优化d[v]
			}
		}
	}
}

从复杂度来看,主要是外层循环 O ( V ) O(V) O(V)与内层循环(寻找最小的d[u]需要 O ( V ) O(V) O(V)、枚举v需要 O ( A d j [ u ] . s i z e ) O(Adj[u].size) O(Adj[u].size)产生的。又由于对整个程序来说,枚举v的次数总共为 O ( E ) O(E) O(E),因此总复杂度为 O ( V 2 + E ) O(V^2+E) O(V2+E)

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-07-23 10:32:07  更:2021-07-23 10:33:02 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年4日历 -2024/4/29 1:28:28-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码