图论常见算法
图论常见算法
- 算法
- prim算法
- Dijkstra算法
- 用途
- 最小生成树(MST):
- 最短路径:
- 拓扑排序:
- 关键路径:
| 算法 | 用途 | 适用条件 | 时间复杂度 |
|---|---|---|---|
| Kruskal | 最小生成树 | 无向图(稀疏图) | O(E log E) |
| Prim | 最小生成树 | 无向图(稠密图) | O(V^2) 或 O(E log V) |
| Dijkstra | 单源最短路径 | 非负权图 | O(V^2) 或 O(E + V log V) |
| Floyd | 多源最短路径 | 允许负权边(无负权环) | O(V^3) |
| AOV | 拓扑排序 | 有向无环图(DAG) | O(V + E) |
| AOE | 关键路径 | 有向无环图(DAG) | O(V + E) |
算法
prim算法

key[MAXN]:存储从MST到每个顶点的最小权重(边)。
inMST[MAXN]:标记每个顶点是否已经在MST中。
优先队列:使用priority_queue(最小堆)来选择当前最小权重边对应的顶点。
-
初始化:
选择一个起始顶点,将其加入生成树。
初始化一个优先队列(最小堆),用于存储所有连接生成树和非生成树顶点的边,按权重排序。
初始化一个数组key,记录每个顶点到生成树的最小权重,起始顶点为0,其余顶点为无穷大(表示未连接)。
初始化一个数组inMST,用于标记每个节点是否已经加入MST中。 -
迭代过程
从优先队列中取出权重最小的边,将其对应的顶点u加入生成树。
遍历u的所有邻接顶点v:如果v未被加入生成树,且边(u, v)的权重小于key[v],则更新key[v]为(u, v)的权重,并将v加入优先队列。
typedef pair<int, int> pii; // 用于表示 (权重, 节点)
const int INF = INT_MAX;void prim(int n, vector<vector<pii>>& adj) {vector<int> key(n, INF); // 存储到每个节点的最小边权vector<bool> inMST(n, false); // 标记节点是否在生成树中priority_queue<pii, vector<pii>, greater<pii>> pq; // 最小堆,存储 (边权, 节点)key[0] = 0; // 从节点 0 开始pq.push({0, 0}); // 初始时将起点加入堆while (!pq.empty()) {int u = pq.top().second; // 当前节点pq.pop();if (inMST[u]) continue; // 如果已经在生成树中,跳过inMST[u] = true; // 标记为在生成树中// 遍历 u 的邻接节点for (auto& edge : adj[u]) {int v = edge.first;int weight = edge.second;// 如果节点 v 不在生成树中且通过 u 到 v 的边更短if (!inMST[v] && weight < key[v]) {key[v] = weight;pq.push({key[v], v}); // 更新最小堆}}}
}
Dijkstra算法

dis[MAXN]:存储从起点到每个节点的最短距离。
vis[MAXN]:标记每个节点是否已被访问。
优先队列:使用priority_queue(最小堆)来选择最短距离对应的顶点。
-
初始化:
选择一个起点。
初始化一个优先队列,用于存储到起点的距离。
初始化一个数组dis,用于存储从起点到每个节点的最短距离。起始顶点为0,其余顶点为无穷大(表示未连接)。
初始化一个数组vis,用于标记每个节点是否已经被访问过(即是否已经找到从起点到该节点的最短路径)。 -
迭代过程
从优先队列中取出离起点的最短距离对应的顶点u。
遍历u的所有邻接顶点v:如果v未被访问,且(u, v)的距离小于dis[v],则更新dis[v]为(u, v)的距离,并将v加入优先队列。
struct edge {int v, w;
};struct node {int dis, u;bool operator>(const node& a) const { return dis > a.dis; }
};vector<edge> e[MAXN];
int dis[MAXN], vis[MAXN];
priority_queue<node, vector<node>, greater<node>> q;void dijkstra(int n, int s) {memset(dis, 0x3f, (n + 1) * sizeof(int));memset(vis, 0, (n + 1) * sizeof(int));dis[s] = 0;q.push({0, s});while (!q.empty()) {int u = q.top().u;q.pop();if (vis[u]) continue;vis[u] = 1;// BFSfor (auto ed : e[u]) {int v = ed.v, w = ed.w;if (dis[v] > dis[u] + w) {dis[v] = dis[u] + w;q.push({dis[v], v});}}}
}
用途
最小生成树(MST):
用途:最小生成树用于找到一个连通图中所有节点的最小连接总成本的树。它被广泛应用于网络设计、构建最优电路、电力网络、交通规划等领域。
实际应用:如设计最小成本的通讯网络、城市间的最短道路规划等。
最短路径:
用途:最短路径算法用于寻找图中两个节点之间的最短路径。它广泛应用于导航系统、网络路由、物流调度等。
实际应用:如计算地图上的最短路线、在网络中寻找数据传输的最优路径等。
拓扑排序:
用途:拓扑排序是有向无环图(DAG)的一种排序方式,确保每个节点都在它依赖的节点之前。它通常用于任务调度、编译器优化、项目计划等。
实际应用:如任务调度中的优先级排序、编译过程中的模块依赖关系等。
关键路径:
用途:关键路径方法(CPM)用于项目管理中,帮助确定哪些任务是“关键”的,即那些对项目完成时间有直接影响的任务。它能帮助管理者合理安排资源,避免延误。
实际应用:如建筑工程的项目管理、软件开发的进度控制等。
相关文章:
图论常见算法
图论常见算法 算法prim算法Dijkstra算法 用途最小生成树(MST):最短路径:拓扑排序:关键路径: 算法用途适用条件时间复杂度Kruskal最小生成树无向图(稀疏图)O(E log E)Prim最小生成树无…...
实战技巧:如何快速提高网站收录的权威性?
本文转自:百万收录网 原文链接:https://www.baiwanshoulu.com/68.html 快速提高网站收录的权威性是一个系统性的工作,涉及内容质量、网站结构、外部链接、用户体验等多个方面。以下是一些实战技巧,可以帮助你快速提升网站收录的权…...
BUU16 [ACTF2020 新生赛]BackupFile1
扫到index.php.bak 实在扫不出来可以试试一些常有的文件,比如flag.php(flag.php.bak),index.php(index.php.bak) <?php include_once "flag.php";if(isset($_GET[key])) {$key $_GET[key…...
js --- 获取随机数
介绍 使用js获取随机数 代码 Math.random()...
运维之MySQL锁机制(MySQL Lock Mechanism for Operation and Maintenance)
运维之MySQL锁机制 锁是一种常见的并发事务的控制方式。MySQL数据库中的锁机制主要用于控制对数据的并发访问,防止多个用户或进程同时对同一数据进行读写操作,从而避免数据不一致和丢失更新等问题。锁机制确保数据的一致性,保证在多个事务操作…...
用Python实现SVM分类器:从数据到决策边界可视化,以鸢尾花数据集为例
前言 在机器学习的世界里,支持向量机(Support Vector Machine,简称SVM)是一种非常强大的分类算法。它通过寻找最优的决策边界,将不同类别的数据分开。本文将通过一个简单的Python代码示例,展示如何使用SVM…...
pytorch使用SVM实现文本分类
人工智能例子汇总:AI常见的算法和例子-CSDN博客 完整代码: import torch import torch.nn as nn import torch.optim as optim import jieba import numpy as np from sklearn.model_selection import train_test_split from sklearn.feature_extract…...
一文速览DeepSeek-R1的本地部署——可联网、可实现本地知识库问答:包括671B满血版和各个蒸馏版的部署
前言 自从deepseek R1发布之后「详见《一文速览DeepSeek R1:如何通过纯RL训练大模型的推理能力以比肩甚至超越OpenAI o1(含Kimi K1.5的解读)》」,deepseek便爆火 爆火以后便应了“人红是非多”那句话,不但遭受各种大规模攻击,即便…...
Kubernetes学习之包管理工具(Helm)
一、基础知识 1.如果我们需要开发微服务架构的应用,组成应用的服务可能很多,使用原始的组织和管理方式就会非常臃肿和繁琐以及较难管理,此时我们需要一个更高层次的工具将这些配置组织起来。 2.helm架构: chart:一个应用的信息集合…...
2024美团春招硬件开发笔试真题及答案解析
目录 一、选择题 1、在 Linux,有一个名为 file 的文件,内容如下所示: 2、在 Linux 中,关于虚拟内存相关的说法正确的是() 3、AT89S52单片机中,在外部中断响应的期间,中断请求标志位查询占用了()。 4、下列关于8051单片机的结构与功能,说法不正确的是()? 5、…...
MyBatis-Plus速成指南:通用枚举 多数据源
通用枚举: 概述: 表中有些字段值是固定的,例如性别(男或女),此时我们可以使用 MyBatis-Plus 的通用枚举来实现 数据库表添加字段: 创建通用枚举类型: Getter public enum SexEnum {MALE(1, "男"…...
Android项目中使用Eclipse导出jar文件
2014年3月24日 天气晴朗 关于打包Android组件肯定是有用到的,比如开发了一个模块,为了更好的复用,我们可能会将它打包成jar文件方便其他项目引用。这个很好理解,也很简单。网上有一堆关于用Eclipse将Android项目打包成jar文件的&…...
网络安全学习 day4
防火墙的安全策略 规则--策略 条件 --- 检查报文的依据,防火墙将报文中携带的信息与条件逐一进行对比, 以此来判断报文是否是 匹配的 。不同的匹配条件之间属于 “ 与 ” 关系;相同的匹配条件中不同的参数信息之间的关系为 “ 或 ” 关系。…...
【SSM】Spring + SpringMVC + Mybatis
SSM课程,以下为该课程的笔记 bean:IOC容器创建的对象 P12 bean的生命周期 在bean中定义init()和destroy()方法,然后在xml中配置方法名,让bean对象能找到对应的生命周期方法。 或通过实现接口的方式定义声明周期方法。 P13 sett…...
智慧园区综合管理系统如何实现多个维度的高效管理与安全风险控制
内容概要 在当前快速发展的城市环境中,智慧园区综合管理系统正在成为各类园区管理的重要工具,无论是工业园、产业园、物流园,还是写字楼与公寓,都在积极寻求如何提升管理效率和保障安全。通过快鲸智慧园区管理系统,用…...
【协议详解】卫星通信5G IoT NTN SIB33-NB 信令详解
一、SIB33信令概述 在5G非地面网络(NTN)中,卫星的高速移动性和广域覆盖特性使得地面设备(UE)需要频繁切换卫星以维持连接。SIB32提供了UE预测当前服务的卫星覆盖信息,SystemInformationBlockType33&#x…...
《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》
文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…...
Debian 10 中 Linux 4.19 内核在 x86_64 架构上对中断嵌套的支持情况
一、中断嵌套的定义与原理 中断嵌套是指在一个中断处理程序(ISR)正在执行的过程中,另一个更高优先级的中断请求到来,系统暂停当前中断处理程序,转而处理新的高优先级中断。处理完高优先级中断后,系统返回到原来的中断处理程序继续执行。这种机制允许系统更高效地响应紧急…...
【Envi遥感图像处理】010:归一化植被指数NDVI计算方法
文章目录 一、NDVI简介二、NDVI计算方法1. NDVI工具2. 波段运算三、注意事项1. 计算结果为一片黑2. 计算结果超出范围一、NDVI简介 归一化植被指数,是反映农作物长势和营养信息的重要参数之一,应用于遥感影像。NDVI是通过植被在近红外波段(NIR)和红光波段(R)的反射率差异…...
优选算法合集————双指针(专题二)
好久都没给大家带来算法专题啦,今天给大家带来滑动窗口专题的训练 题目一:长度最小的子数组 题目描述: 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其和 ≥ target 的长度最小的 连续子数组 [numsl, numsl1, …...
基于微信小程序的私家车位共享系统设计与实现(LW+源码+讲解)
专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…...
糖化之前,为什么要进行麦芽粉碎?
糖化的目的是将麦芽中的淀粉转化为可发酵性的糖分,而糖化之前,进行麦芽粉碎是确保糖化效果的关键步骤。本文天泰将阐述麦芽粉碎的重要性及其对酿造过程的影响。 一、麦芽粉碎的目的 增加酶的作用面积:麦芽中的淀粉和蛋白质等物质需要通过酶…...
PAT甲级1052、Linked LIst Sorting
题目 A linked list consists of a series of structures, which are not necessarily adjacent in memory. We assume that each structure contains an integer key and a Next pointer to the next structure. Now given a linked list, you are supposed to sort the stru…...
半导体器件与物理篇6 MESFET
金属-半导体接触 MESFET与MOSFET的相同点:它们的电压电流特性相似。都有源漏栅三极,强反型,漏极加正向电压,也会经历线性区、夹断点、饱和区三个阶段。 MESFET与MOSFET的不同点:在器件的栅电极部分,MESFE…...
BES2700源码解析之系统初始化
一 概述 bes2700凭借着超高的性能,超低的功耗,在可穿戴领域有着广泛的应用。笔者使用该芯片做了一些产品解决方案,发现该芯片的性能十分强大。这里做个系列的源码解析。 二 源码解析 1.GPIO和led灯的初始化: tgt_hardware_setup(…...
deepseek 本地化部署和小模型微调
安装ollama 因为本人gpu卡的机器系统是centos 7, 直接使用ollama会报 所以ollama使用镜像方式进行部署, 拉取镜像ollama/ollama 启动命令 docker run -d --privileged -v ollama:/root/.ollama -p 11434:11434 --name ollama ollama/ollama 查看ollama 是否启动…...
socket实现HTTP请求,参考HttpURLConnection源码解析
背景 有台服务器,网卡绑定有2个ip地址,分别为: A:192.168.111.201 B:192.168.111.202 在这台服务器请求目标地址 C:192.168.111.203 时必须使用B作为源地址才能访问目标地址C,在这台服务器默认…...
3、C#基于.net framework的应用开发实战编程 - 实现(三、三) - 编程手把手系列文章...
三、 实现; 三.三、编写应用程序; 此文主要是实现应用的主要编码工作。 1、 分层; 此例子主要分为UI、Helper、DAL等层。UI负责便签的界面显示;Helper主要是链接UI和数据库操作的中间层;DAL为对数据库的操…...
Ubuntu下Tkinter绑定数字小键盘上的回车键(PySide6类似)
设计了一个tkinter程序,在Win下绑定回车键,直接绑定"<Return>"就可以使用主键盘和小键盘的回车键直接“提交”,到了ubuntu下就不行了。经过搜索,发现ubuntu下主键盘和数字小键盘的回车键,名称不一样。…...
基础笔记|splice()的用法
一、三种用法 splice(index, 0, element) 插入 元素,不删除任何元素。splice(index, deleteCount) 删除 deleteCount 个元素。splice(index, deleteCount, element1, element2, ...) 替换 元素,即删除 deleteCount 个元素,同时插入新的元素。…...
