当前位置: 首页 > news >正文

数据结构_图的应用

最小生成树

Prim算法

在这里插入图片描述

int AMGraph::sum(string v)
{int start, totalW, cnt, minW, u, vv, i, j;start = LocateVex(v); // 获取起始顶点编号memset(visited, false, sizeof(visited)); // 初始化访问状态visited[start] = true;totalW = 0; // 最小生成树的总权重cnt = 1; // 当前生成树包含的顶点数while (cnt < vexnum){minW = INT_MAX; // 当前最小边权值u = -1; // 最小边的两个端点vv = -1;for (i = 0; i < vexnum; i++){// 遍历已加入生成树的顶点if (visited[i]){for (j = 0; j < vexnum; j++){if (!visited[j] && arcs[i][j] < minW){minW = arcs[i][j];u = i; // 起始点vv = j; // 终点}}}}// 无法继续扩展生成树if (vv == -1){break;}visited[vv] = true; // 将v加入生成树totalW += minW; // 累加权值cnt++; // 增加生成树的顶点计数}return totalW;
}

Kruskal算法

在这里插入图片描述

void AMGraph::kruskal()
{int i, j;for (i = 0; i < arcnum; i++) // 将所有的边按照从小到大排序{for (j = i + 1; j < arcnum; j++){if ((edges[i].w > edges[j].w) || (edges[i].w == edges[j].w && edges[i].u > edges[j].u)){Edge temp = edges[i];edges[i] = edges[j];edges[j] = temp;}}}for (i = 0; i < vexnum; i++) // 初始化{Vexset[i] = i;}for (i = 0; i < arcnum; i++) // 遍历所有的边{int v1 = edges[i].u; // 边的始点的下标int v2 = edges[i].v; // 边的终点的下标int vs1 = Vexset[v1]; // 连通分量int vs2 = Vexset[v2];// 如果两个节点不在同一棵树中,说明这条边可以添加到最小生成树中if (vs1 != vs2){if (edges[i].u < edges[i].v){cout << vexs[edges[i].u] << " " << vexs[edges[i].v] << " " << edges[i].w << endl;}else{cout << vexs[edges[i].v] << " " << vexs[edges[i].u] << " " << edges[i].w << endl;}// 合并两个分量for (j = 0; j < arcnum; j++){if (Vexset[j] == vs2){Vexset[j] = vs1;}}}}
}

两种算法比较

在这里插入图片描述

最短路径

Dijkstra算法

在这里插入图片描述
在这里插入图片描述

#include <iostream>
#include <climits>
#include <algorithm>
#include <string>
using namespace std;const int MaxLen = 100; // 设定图最多包含顶点class Map
{
private:string vexsU[MaxLen]; // 顶点表bool visited[MaxLen]; // 访问标志数组int Maxtrix[MaxLen][MaxLen]; // 图的邻接矩阵int Vexnum; // 图的顶点个数int dist[MaxLen]; // 存储源点到每个节点的最短距离int path[MaxLen]; // 用于存储每个顶点的前驱节点
public:void SetMatrix(int vnum, int mx[MaxLen][MaxLen], string vexs[MaxLen]);void Dijkstra(int n, string s);int LocateVex(string u);void PrintPath(int start, int end); // 打印从 start 到 end 的路径
};// 设置邻接矩阵和顶点表
void Map::SetMatrix(int vnum, int mx[MaxLen][MaxLen], string vexs[MaxLen])
{Vexnum = vnum;for (int i = 0; i < vnum; i++){vexsU[i] = vexs[i]; // 初始化顶点表for (int j = 0; j < vnum; j++){Maxtrix[i][j] = mx[i][j];}}
}// 打印路径
void Map::PrintPath(int start, int end)
{if (start == end){cout << vexsU[start];return;}if (path[end] == -1){cout << "无路径";return;}PrintPath(start, path[end]);cout << " " << vexsU[end];
}// 迪杰斯特拉算法
void Map::Dijkstra(int n, string s)
{// 初始化距离数组、访问数组和路径数组for (int i = 0; i < n; i++){dist[i] = INT_MAX;visited[i] = false;path[i] = -1; // -1 表示无前驱}int start = LocateVex(s);dist[start] = 0; // 起点到自身的距离为 0for (int i = 0; i < n; i++){int u = -1;// 从未访问的节点中找到距离最近的节点 ufor (int j = 0; j < n; j++){if (!visited[j] && (u == -1 || dist[j] < dist[u])){u = j;}}if (u == -1 || dist[u] == INT_MAX){break; // 剩余节点不可达}visited[u] = true; // 标记该节点为已访问// 更新所有与 u 相邻的节点的距离for (int v = 0; v < n; v++){if (Maxtrix[u][v] != INT_MAX && dist[u] + Maxtrix[u][v] < dist[v]){dist[v] = dist[u] + Maxtrix[u][v];path[v] = u; // 更新前驱节点}}}// 输出最短路径for (int i = 1; i < n; i++){cout << vexsU[start] << "-" << vexsU[i] << "-";if (dist[i] == INT_MAX){cout << "-1" << endl; // 不可达}else{cout << dist[i] << "----[";PrintPath(start, i);cout << " ]" << endl;}}
}// 定位顶点索引
int Map::LocateVex(string u)
{for (int i = 0; i < Vexnum; i++){if (u == vexsU[i]){return i;}}return -1;
}int main()
{int t, n, i, j, Matrix[MaxLen][MaxLen];string vexs[MaxLen], start;cin >> t;while (t--){cin >> n; // 顶点数for (i = 0; i < n; i++){cin >> vexs[i]; // 输入每个顶点名称}for (i = 0; i < n; i++){for (j = 0; j < n; j++){cin >> Matrix[i][j];if (Matrix[i][j] == 0 && i != j){Matrix[i][j] = INT_MAX; // 没有边的情况}}}cin >> start;Map m;m.SetMatrix(n, Matrix, vexs);m.Dijkstra(n, start);}return 0;
}

Foyed算法

在这里插入图片描述

拓扑排序

在这里插入图片描述
在这里插入图片描述

// 求各顶点的入度
void Map::FindInDegree()
{int i, j;// 初始化for (i = 0; i < MaxLen; i++){indegree[i] = 0;}for (i = 0; i < Vexnum; i++){for (j = 0; j < Vexnum; j++){if (Maxtrix[i][j] == 1){indegree[j]++;}}}
}// 输出拓扑排序的结果
void Map::topo()
{int i, k, m, current;queue<int> q;FindInDegree(); // 求各顶点的入度for (i = 0; i < Vexnum; i++){// 入度为0者进栈if (indegree[i] == 0){q.push(i);}}m = 0; // 对输出顶点计数,初始为0while (!q.empty()){current = q.front();q.pop();tp[m] = current;m++;for (k = 0; k < Vexnum; k++){if (Maxtrix[current][k] == 1){indegree[k]--;if (indegree[k] == 0){q.push(k);}}}}if (m == Vexnum){for (i = 0; i < m; i++){cout << tp[i] << " ";}}cout << endl;
}

关键路径

相关文章:

数据结构_图的应用

最小生成树 Prim算法 int AMGraph::sum(string v) {int start, totalW, cnt, minW, u, vv, i, j;start LocateVex(v); // 获取起始顶点编号memset(visited, false, sizeof(visited)); // 初始化访问状态visited[start] true;totalW 0; // 最小生成树的总权重cnt 1; // 当前…...

C#中面试的常见问题002

1.wpf和Winfrom的区别 1. 技术基础 WPF&#xff1a;基于.NET Framework&#xff0c;使用XAML&#xff08;可扩展应用程序标记语言&#xff09;作为界面描述语言&#xff0c;支持矢量图形和高级布局。WinForms&#xff1a;基于.NET Framework&#xff0c;使用纯代码或拖放设计…...

快速理解微服务中Ribbon的概念

一.基本概念 1.在微服务架构中&#xff0c;Ribbon 是一个客户端负载均衡器&#xff0c;用于控制服务间的通信方式。 2.Ribbon 是一个开源的库&#xff0c;最早由 Netflix 开发&#xff0c;用于实现客户端负载均衡。 3.Ribbon 主要解决的是在微服务架构中&#xff0c;多个服务…...

K8S简介、使用教程

以下是关于 Kubernetes&#xff08;通常缩写为 K8S&#xff09;的简介和使用教程&#xff1a; 一、Kubernetes 简介 定义与作用 Kubernetes 是一个开源的容器编排平台&#xff0c;用于自动化部署、扩展和管理容器化应用程序。它最初由谷歌开发&#xff0c;后捐赠给云原生计算基…...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【四】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

麦肯锡报告 | 科技落地的真谛:超越技术本身的价值创造

科技创新正在以惊人的速度改变企业运作和客户体验&#xff0c;但实现其潜力的关键在于正确的策略、流程、文化和人才。麦肯锡强调了一个理念&#xff1a;Never just tech&#xff08;不仅仅是技术&#xff09;。这表明&#xff0c;成功的数字化转型不仅依赖于技术&#xff0c;还…...

彻底解决 macOS 下Matplotlib 中文显示乱码问题

彻底解决 macOS 下Matplotlib 中文显示乱码问题 在使用 Python 的 Matplotlib 库进行数据可视化时&#xff0c;中文字符的显示常常会出现乱码问题&#xff0c;尤其在 macOS 系统上。在网上找了一大堆方法&#xff0c;花了很久&#xff0c;发现不是要安装各种字体就是要改配置&…...

STM32-- keil 的option for target使用

keil版本号 1.device界面 如&#xff1a;stm32f103c8t6的工程&#xff0c;可以直接在device这里修改成stm32f103vct6&#xff0c;虽然引脚不一样&#xff0c;但是很多一样的地方&#xff0c;可以直接使用&#xff0c;有些不修改也可以下载程序。 2.target xtal的设置不起作用了…...

【MCU】微控制器的编程技术:ISP 与 IAP

在嵌入式领域中&#xff0c;将程序下载到内置 Flash 有两种技术 ISP (In-system programming) ISP 即在系统编程&#xff0c;是指一些可编程逻辑器件、微控制器、芯片组和其他嵌入式设备在安装到完整嵌入式系统后能够进行编程&#xff0c;而不需要在将芯片安装到系统中之前对…...

C#基础题总结

16.一张单据上有一个5位数的号码为6**42&#xff0c;其中百位数和千位数已模糊不清&#xff0c;但知道该数能被 57 和 67 除尽。设计一个算法&#xff0c;找出该单据所有可能的号码。 17.编程序求2&#xff5e;10000以内的完全数。一个数的因子&#xff08;除了这个数本身&…...

Elasticsearch中的节点(比如共20个),其中的10个选了一个master,另外10个选了另一个master,怎么办?

大家好&#xff0c;我是锋哥。今天分享关于【Elasticsearch中的节点&#xff08;比如共20个&#xff09;&#xff0c;其中的10个选了一个master&#xff0c;另外10个选了另一个master&#xff0c;怎么办&#xff1f;】面试题。希望对大家有帮助&#xff1b; Elasticsearch中的节…...

《参与中型项目,领略 Spring 魅力》

一、Spring 在中型项目中的魅力展现 Spring 框架以其强大的功能和灵活性&#xff0c;在中型项目中发挥着重要作用。它不仅简化了开发过程&#xff0c;还提高了代码的可维护性和可扩展性。 Spring 在中型项目中魅力十足&#xff0c;其优势主要体现在以下几个方面。 首先&#…...

计算机网络-GRE(通用路由封装协议)简介

昨天我们学习了VPN的基本概念&#xff0c;虚拟专用网络在当前企业总部与分支间广泛使用。常用的划分方法为基于协议层次有GRE VPN、IPSec VPN、L2TP VPN、PPTP VPN、SSL VPN等。其实我有考虑该怎么讲&#xff0c;因为在IP阶段好像虚拟专用网络讲得不深&#xff0c;在IE的阶段会…...

开源电话机器人产品的优点是什么?

开源电话机器人产品的优点是什么&#xff1f; 作者&#xff1a;开源呼叫中心系统 FreeIPCC&#xff0c;Github地址&#xff1a;https://github.com/lihaiya/freeipcc 开源电话机器人产品作为人工智能技术的一种应用&#xff0c;近年来在电销、客户服务等多个领域展现出了显著的…...

Spring Boot 集成 Knife4j 的 Swagger 文档

在开发微服务应用时&#xff0c;API 文档的生成和维护是非常重要的一环。Swagger 是一个非常流行的 API 文档工具&#xff0c;可以帮助我们自动生成 RESTful API 的文档&#xff0c;并提供了一个友好的界面供开发者测试 API。本文将介绍如何在 Spring Boot 项目中集成 Knife4j …...

极狐GitLab 17.6 正式发布几十项与 DevSecOps 相关的功能【一】

GitLab 是一个全球知名的一体化 DevOps 平台&#xff0c;很多人都通过私有化部署 GitLab 来进行源代码托管。极狐GitLab 是 GitLab 在中国的发行版&#xff0c;专门为中国程序员服务。可以一键式部署极狐GitLab。 学习极狐GitLab 的相关资料&#xff1a; 极狐GitLab 官网极狐…...

C# 在Word文档模板中,按照占位符插入文字或图片

1&#xff0c;引入包&#xff1a;DocX 2,代码如下 public class CC{public static void Ma22in(){// 示例&#xff1a;加载现有模板并替换占位符string templatePath "报告模板.docx"; // 模板文件路径string outputPath "Output.docx"; // 输出文…...

在使用PCA算法进行数据压缩降维时,如何确定最佳维度是一个关键问题?

一、PCA算法的基本原理 PCA算法的核心思想是通过正交变换&#xff0c;将一组可能相关的变量转换成一组线性不相关的变量&#xff0c;称为主成分。这组主成分能够以最小的信息损失来尽可能多地保留原始数据集的变异性。具体来说&#xff0c;PCA算法包括以下几个步骤&#xff1a…...

深度学习3

五、自动微分 1、基础概念 模块 autograd 负责自动计算张量操作的梯度&#xff0c;具有自动求导功能&#xff1b;autograd 创建一个动态计算图来跟踪张量的操作&#xff0c;每个张量是计算图中的一个节点&#xff0c;节点之间的操作构成图的边。 属性 requires_grad 决定…...

Qt5.14.2的安装与环境变量及一些依赖库的配置

目录 1.Qt5.14.2安装 2.Qt环境变量及一些依赖库的配置 1.Qt5.14.2安装 QT从入门到入土&#xff08;一&#xff09;——Qt5.14.2安装教程和VS2019环境配置 - 唯有自己强大 - 博客园 2.Qt环境变量及一些依赖库的配置 假设QT安装目录为: D:\Qt\Qt5.14.2 将目录: D:\Qt\Qt5.14.…...

Pixel Fashion Atelier部署教程:Stable Diffusion像素时装生成工作站保姆级安装指南

Pixel Fashion Atelier部署教程&#xff1a;Stable Diffusion像素时装生成工作站保姆级安装指南 1. 项目介绍 Pixel Fashion Atelier&#xff08;像素时装锻造坊&#xff09;是一款基于Stable Diffusion与Anything-v5模型的图像生成工作站。与传统AI工具不同&#xff0c;它采…...

MySQL局域网远程连接测试教程

MySQL局域网远程连接测试教程1本地服务器安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须)防火墙配置2远程访问用户电脑配置IP配置安装 Workbench客户端1本地服务器 安装MySQL服务器&#xff0c;安装MySQL shell, Workbench(非必须) 点击右下角的Advanced Opt…...

League-Toolkit:提升英雄联盟游戏体验的开源工具集

League-Toolkit&#xff1a;提升英雄联盟游戏体验的开源工具集 【免费下载链接】League-Toolkit 兴趣使然的、简单易用的英雄联盟工具集。支持战绩查询、自动秒选等功能。基于 LCU API。 项目地址: https://gitcode.com/gh_mirrors/le/League-Toolkit League-Toolkit是基…...

hot100——二分查找

4.寻找两个正序数组的中位数解题思路首先&#xff0c;题目中已经说明&#xff0c;是正序&#xff0c;那么nums1以及nums2中都是从小到大进行排列的&#xff1b;又因为题目中要求时间复杂度为O(log(mn))&#xff0c;一般看到这种时间复杂度是O(log……)形式的&#xff0c;基本上…...

LeetCode 153. 旋转排序数组找最小值:二分最优思路

LeetCode中等难度的经典题目——153. 寻找旋转排序数组中的最小值。这道题的核心考点是「二分查找」&#xff0c;难点在于如何利用“旋转排序数组”的特性&#xff0c;在O(log n)时间复杂度内找到最小值&#xff0c;也是面试中常考的二分变形题。 一、题目解读&#xff1a;读懂…...

开源 AI 应用平台实战部署:从零搭建到插件调试避坑指南

1. 开源AI平台部署前的环境准备 在开始部署Dify和AIFlowy之前&#xff0c;环境准备是至关重要的一步。我遇到过不少开发者因为基础环境没配好&#xff0c;导致后续步骤频繁报错的情况。这里分享下Windows和Linux双平台下的实战经验。 对于Dify平台&#xff0c;你需要准备Python…...

使用Perfetto进行Settings中网络热点开启后anr分析的整体流程记录

目录 一.背景 二.Perfetto使用流程 阶段一&#xff1a;抓取 Perfetto Trace 文件 1. 指令核心解析 2. 数据源功能详解 (这些是抓取的“维度”) 3. 该指令的作用场景 阶段二&#xff1a;导入并认识 Perfetto UI 面板 1. 致命异常&#xff1a;Duration: (Did not end) 2…...

程序员巫术:用玩偶诅咒删库的同事

——软件测试从业者的专业反思与健康应对在软件开发的战场上&#xff0c;测试工程师常被视为“质量守门人”&#xff0c;肩负着拦截缺陷、守护产品稳定的重任。然而&#xff0c;当一位愤怒的测试员掏出针线缝制玩偶&#xff0c;试图用“巫术”诅咒那位鲁莽删库的同事时&#xf…...

比亚迪多款新车激光雷达性能超越华为:千线级感知开启智驾新纪元

2026年,中国智能驾驶行业正式进入“千线级激光雷达”时代。继华为发布896线双光路激光雷达后,比亚迪携速腾聚创EM4数字化激光雷达强势反击,以1080线物理扫描、600米最远探测的硬核参数,在核心感知硬件上实现对华为的全面超越。这一突破不仅标志着比亚迪补齐了智能化短板,更…...

MATLAB Simulink代码生成全流程详解:涵盖环境配置、参数与信号配置、函数名配置、数...

matlab simulink代码生成 包括&#xff1a;环境配置&#xff0c;参数与信号配置&#xff0c;函数名配置&#xff0c;数据管理&#xff0c;代码生成&#xff0c;以及代码优化等 文档63页把Simulink模型变成可烧录的C代码&#xff0c;这事儿听起来挺玄乎&#xff0c;但只要你踩过…...