当前位置: 首页 > 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.…...

超短脉冲激光自聚焦效应

前言与目录 强激光引起自聚焦效应机理 超短脉冲激光在脆性材料内部加工时引起的自聚焦效应&#xff0c;这是一种非线性光学现象&#xff0c;主要涉及光学克尔效应和材料的非线性光学特性。 自聚焦效应可以产生局部的强光场&#xff0c;对材料产生非线性响应&#xff0c;可能…...

PHP和Node.js哪个更爽?

先说结论&#xff0c;rust完胜。 php&#xff1a;laravel&#xff0c;swoole&#xff0c;webman&#xff0c;最开始在苏宁的时候写了几年php&#xff0c;当时觉得php真的是世界上最好的语言&#xff0c;因为当初活在舒适圈里&#xff0c;不愿意跳出来&#xff0c;就好比当初活在…...

【Linux】C语言执行shell指令

在C语言中执行Shell指令 在C语言中&#xff0c;有几种方法可以执行Shell指令&#xff1a; 1. 使用system()函数 这是最简单的方法&#xff0c;包含在stdlib.h头文件中&#xff1a; #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

【python异步多线程】异步多线程爬虫代码示例

claude生成的python多线程、异步代码示例&#xff0c;模拟20个网页的爬取&#xff0c;每个网页假设要0.5-2秒完成。 代码 Python多线程爬虫教程 核心概念 多线程&#xff1a;允许程序同时执行多个任务&#xff0c;提高IO密集型任务&#xff08;如网络请求&#xff09;的效率…...

前端开发面试题总结-JavaScript篇(一)

文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包&#xff08;Closure&#xff09;&#xff1f;闭包有什么应用场景和潜在问题&#xff1f;2.解释 JavaScript 的作用域链&#xff08;Scope Chain&#xff09; 二、原型与继承3.原型链是什么&#xff1f;如何实现继承&a…...

优选算法第十二讲:队列 + 宽搜 优先级队列

优选算法第十二讲&#xff1a;队列 宽搜 && 优先级队列 1.N叉树的层序遍历2.二叉树的锯齿型层序遍历3.二叉树最大宽度4.在每个树行中找最大值5.优先级队列 -- 最后一块石头的重量6.数据流中的第K大元素7.前K个高频单词8.数据流的中位数 1.N叉树的层序遍历 2.二叉树的锯…...

LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf

FTP 客服管理系统 实现kefu123登录&#xff0c;不允许匿名访问&#xff0c;kefu只能访问/data/kefu目录&#xff0c;不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...

C/C++ 中附加包含目录、附加库目录与附加依赖项详解

在 C/C 编程的编译和链接过程中&#xff0c;附加包含目录、附加库目录和附加依赖项是三个至关重要的设置&#xff0c;它们相互配合&#xff0c;确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中&#xff0c;这些概念容易让人混淆&#xff0c;但深入理解它们的作用和联…...

解决:Android studio 编译后报错\app\src\main\cpp\CMakeLists.txt‘ to exist

现象&#xff1a; android studio报错&#xff1a; [CXX1409] D:\GitLab\xxxxx\app.cxx\Debug\3f3w4y1i\arm64-v8a\android_gradle_build.json : expected buildFiles file ‘D:\GitLab\xxxxx\app\src\main\cpp\CMakeLists.txt’ to exist 解决&#xff1a; 不要动CMakeLists.…...