图论常见算法

图论常见算法

  • 算法
    • 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;不易合同频过着接地气的生活…

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…

简单介绍一下什么是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 则因其简洁易用的语法、丰富的库和强大的…

生成式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…

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍

鸿蒙Harmony-双向数据绑定MVVM以及$$语法糖介绍 1.1 双向数据绑定概念 在鸿蒙&#xff08;HarmonyOS&#xff09;应用开发中&#xff0c;双向数据改变&#xff08;或双向数据绑定&#xff09;是一种让数据模型和UI组件之间保持同步的机制&#xff0c;当数据发生变化时&#x…

git基础使用--3---git安装和基本使用

文章目录 git基础使用--3--git-安装和基本使用1. git工具安装1.1 git1.2 TortoiseGit1.3 远程仓2. git本地仓库版本管理2.1 git常用命令2.2 git基本操作2.2.1 设置用户名和邮箱 2.2 git基本操作2.2.1 初始化本地仓 git init2.2.2 查看本地库状态 git status2.2.3 添加暂缓区2.2…

JVM执行流程与架构(对应不同版本JDK)

直接上图&#xff08;对应JDK8以及以后的HotSpot&#xff09; 这里主要区分说明一下 方法区于 字符串常量池 的位置更迭&#xff1a; 方法区 JDK7 以及之前的版本将方法区存放在堆区域中的 永久代空间&#xff0c;堆的大小由虚拟机参数来控制。 JDK8 以及之后的版本将方法…

信息安全专业2025最新毕业设计选题汇总:课题精选

目录 前言 毕设选题 开题指导建议 更多精选选题 选题帮助 最后 前言 大家好,这里是海浪学长毕设专题! 大四是整个大学期间最忙碌的时光&#xff0c;一边要忙着准备考研、考公、考教资或者实习为毕业后面临的升学就业做准备,一边要为毕业设计耗费大量精力。学长给大家整理…

c++ 定点 new 及其汇编解释

&#xff08;1&#xff09; 代码距离&#xff1a; #include <new> // 需要包含这个头文件 #include <iostream>int main() {char buffer[sizeof(int)]; // 分配一个足够大的字符数组作为内存池int* p new(&buffer) int(42); // 使用 placement new…

C++多线程编程——基于策略模式、单例模式和简单工厂模式的可扩展智能析构线程

1. thread对象的析构问题 在 C 多线程标准库中&#xff0c;创建 thread 对象后&#xff0c;必须在对象析构前决定是 detach 还是 join。若在 thread 对象销毁时仍未做出决策&#xff0c;程序将会终止。 然而&#xff0c;在创建 thread 对象后、调用 join 前的代码中&#xff…

UE求职Demo开发日志#21 背包-仓库-装备栏移动物品

1 创建一个枚举记录来源位置 UENUM(BlueprintType) enum class EMyItemLocation : uint8 {None0,Bag UMETA(DisplayName "Bag"),Armed UMETA(DisplayName "Armed"),WareHouse UMETA(DisplayName "WareHouse"), }; 2 创建一个BagPad和WarePa…

分割链表

题目&#xff1a; 给定一个链表的头节点和一个特定值 x &#xff0c;请你对链表进行分隔&#xff0c;使得所有小于 x 的节点都出现在大于等于 x 的节点之前 ( 链表中节点数为[0,500]&#xff0c;不要求链表的顺序 &#xff09; 思路一&#xff1a;在原链表上进行修改 在原链表…