图论常见算法

图论常见算法

  • 算法
    • 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(最小堆)来选择当前最小权重边对应的顶点。

  1. 初始化:
    选择一个起始顶点,将其加入生成树。
    初始化一个优先队列(最小堆),用于存储所有连接生成树和非生成树顶点的边,按权重排序。
    初始化一个数组key,记录每个顶点到生成树的最小权重,起始顶点为0,其余顶点为无穷大(表示未连接)。
    初始化一个数组inMST,用于标记每个节点是否已经加入MST中。

  2. 迭代过程
    从优先队列中取出权重最小的边,将其对应的顶点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(最小堆)来选择最短距离对应的顶点。

  1. 初始化:
    选择一个起点。
    初始化一个优先队列,用于存储到起点的距离。
    初始化一个数组dis,用于存储从起点到每个节点的最短距离。起始顶点为0,其余顶点为无穷大(表示未连接)。
    初始化一个数组vis,用于标记每个节点是否已经被访问过(即是否已经找到从起点到该节点的最短路径)。

  2. 迭代过程
    从优先队列中取出离起点的最短距离对应的顶点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)用于项目管理中,帮助确定哪些任务是“关键”的,即那些对项目完成时间有直接影响的任务。它能帮助管理者合理安排资源,避免延误。
实际应用:如建筑工程的项目管理、软件开发的进度控制等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/69090.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

车载软件架构 --- 基于AUTOSAR软件架构的ECU开发流程小白篇

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 简单&#xff0c;单纯&#xff0c;喜欢独处&#xff0c;独来独往&#xff0c;不易合同频过着接地气的生活…

在CentOS服务器上部署DeepSeek R1

在CentOS服务器上部署DeepSeek R1,并通过公网IP与其进行对话,可以按照以下步骤操作: 一、环境准备 系统要求: CentOS 8+(需支持AVX512指令集)。 硬件配置: GPU版本:NVIDIA驱动520+,CUDA 11.8+。 CPU版本:至少16核处理器,64GB内存。 存储空间:原始模型需要30GB,量…

nlp文章相似度

1. 基于词袋模型&#xff08;Bag of Words&#xff09; 方法&#xff1a; 将文本表示为词频向量&#xff08;如TF-IDF&#xff09;&#xff0c;通过余弦相似度计算相似性。 优点&#xff1a;简单快速&#xff0c;适合短文本或主题明显的场景。 缺点&#xff1a;忽略词序和语…

Linux 传输层协议 UDP 和 TCP

UDP 协议 UDP 协议端格式 16 位 UDP 长度, 表示整个数据报(UDP 首部UDP 数据)的最大长度如果校验和出错, 就会直接丢弃 UDP 的特点 UDP 传输的过程类似于寄信 . 无连接: 知道对端的 IP 和端口号就直接进行传输, 不需要建立连接不可靠: 没有确认机制, 没有重传机制; 如果因…

Android学习21 -- launcher

1 前言 之前在工作中&#xff0c;第一次听到launcher有点蒙圈&#xff0c;不知道是啥&#xff0c;当时还赶鸭子上架去和客户PK launcher的事。后来才知道其实就是安卓的桌面。本来还以为很复杂&#xff0c;毕竟之前接触过windows的桌面&#xff0c;那叫一个复杂。。。 后面查了…

unity学习26:用Input接口去监测: 鼠标,键盘,虚拟轴,虚拟按键

目录 1 用Input接口去监测&#xff1a;鼠标&#xff0c;键盘&#xff0c;虚拟轴&#xff0c;虚拟按键 2 鼠标 MouseButton 事件 2.1 鼠标的基本操作 2.2 测试代码 2.3 测试情况 3 键盘Key事件 3.1 键盘的枚举方式 3.2 测试代码同上 3.3 测试代码同上 3.4 测试结果 4…

深度剖析八大排序算法

欢迎并且感谢大家指出我的问题&#xff0c;由于本人水平有限&#xff0c;有些内容写的不是很全面&#xff0c;只是把比较实用的东西给写下来&#xff0c;如果有写的不对的地方&#xff0c;还希望各路大牛多多指教&#xff01;谢谢大家&#xff01;&#x1f970; 在计算机科学领…

在深度学习中,样本不均衡问题是一个常见的挑战,尤其是在你的老虎机任务中,某些的中奖倍数较高

在深度学习中,样本不均衡问题是一个常见的挑战,尤其是在你的老虎机任务中,某些的中奖倍数较高 在深度学习中,样本不均衡问题是一个常见的挑战,尤其是在你的老虎机任务中,某些的中奖倍数较高而其他的中奖倍数较低。这种不均衡会导致模型偏向于高频样本(低中奖倍数的),…

04树 + 堆 + 优先队列 + 图(D1_树(D10_决策树))

目录 一、引言 二、算法原理 三、算法实现 四、知识小结 一、引言 决策树算法是一种常用的机器学习算法&#xff0c;可用于分类和回归问题。它基于特征之间的条件判断来构 建一棵树&#xff0c;树的每个节点代表一个特征&#xff0c;每个叶节点代表一个类别或回归值。决策…

简单介绍一下什么是OpenFeign

OpenFeign是什么&#xff1f; OpenFeign是一个声明式的Http客户端&#xff0c;它可以用来发起Http请求 它主要用于SpringCloud微服务之间的通讯&#xff0c;让调用另一个服务的Java方法和调用本地方法一样快速和便捷 之前我们是用RestTemplate写一大堆东西发起Http请求远程调…

Hugging Face GGUF 模型可视化

Hugging Face GGUF 模型可视化 1. Finding GGUF files (检索 GGUF 模型)2. Viewer for metadata & tensors info (可视化 GGUF 模型)References 无知小儿&#xff0c;仙家雄霸天下&#xff0c;依附强者才是唯一的出路。否则天地虽大&#xff0c;也让你们无路可走&#xff0…

Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践

title: Python 与 PostgreSQL 集成:深入 psycopg2 的应用与实践 date: 2025/2/4 updated: 2025/2/4 author: cmdragon excerpt: PostgreSQL 作为开源关系型数据库的佼佼者,因其强大的功能与性能被广泛应用于各种项目中。而 Python 则因其简洁易用的语法、丰富的库和强大的…

Vant框架:助力移动端开发的利器

Vant框架&#xff1a;助力移动端开发的利器 在移动互联网飞速发展的今天&#xff0c;开发一款用户体验出色、界面美观且功能强大的移动端应用并非易事。而Vant框架&#xff0c;作为一款专为移动端设计的Vue.js UI组件库&#xff0c;凭借其轻量级、高度可定制化以及丰富的组件库…

生成式AI安全最佳实践 - 抵御OWASP Top 10攻击 (上)

今天小李哥将开启全新的技术分享系列&#xff0c;为大家介绍生成式AI的安全解决方案设计方法和最佳实践。近年来&#xff0c;生成式 AI 安全市场正迅速发展。据 IDC 预测&#xff0c;到 2025 年全球 AI 安全解决方案市场规模将突破 200 亿美元&#xff0c;年复合增长率超过 30%…

《LLM大语言模型深度探索与实践:构建智能应用的新范式,融合代理与数据库的高级整合》

文章目录 Langchain的定义Langchain的组成三个核心组件实现整个核心组成部分 为什么要使用LangchainLangchain的底层原理Langchain实战操作LangSmithLangChain调用LLM安装openAI库-国内镜像源代码运行结果小结 使用Langchain的提示模板部署Langchain程序安装langserve代码请求格…

开发板上Qt运行的环境变量的三条设置语句的详解

在终端中运行下面三句命令用于配置开发板上Qt运行的环境变量&#xff1a; export QT_QPA_GENERIC_PLUGINStslib:/dev/input/event1 export QT_QPA_PLATFORMlinuxfb:fb/dev/fb0 export QT_QPA_FONTDIR/usr/lib/fonts/设置成功后可以用下面的语句检查设置成功没有 echo $QT_QPA…

e2studio开发RA4M2(6)----GPIO外部中断(IRQ)配置

e2studio开发RA4M2.6--GPIO外部中断&#xff08;IRQ&#xff09;配置 概述视频教学样品申请硬件准备参考程序源码下载新建工程工程模板保存工程路径芯片配置工程模板选择时钟设置SWD调试口设置GPIO口配置按键中断配置中断回调函数主程序 概述 GPIO&#xff08;通用输入/输出&a…

Kafka SSL(TLS)安全协议

文章目录 Kafka SSL&#xff08;TLS&#xff09;安全协议1. Kafka SSL 的作用1.1 数据加密1.2 身份认证1.3 数据完整性1.4 防止中间人攻击1.5 确保安全的分布式环境1.6 防止拒绝服务&#xff08;DoS&#xff09;攻击 2. Kafka SSL 配置步骤&#xff08;1&#xff09;创建 SSL 证…

解决带空格的字符串输入问题:C/C++中的几种常用函数

解决带空格的字符串输入问题&#xff1a;C/C中的几种常用函数 在C/C编程中&#xff0c;读取带空格的字符串一直是一个常见的问题。传统的 scanf 和 gets 函数在处理带空格字符串时往往会遇到一些限制和问题。为了更加安全地处理带空格的字符串输入&#xff0c;我们可以选择不同…