11111

在这里插入图片描述

#include <iostream>
#include <vector>
#include <queue>
#include <algorithm>using namespace std;// 边的结构体
struct Edge {int src, dest, weight;// 按照权重进行排序bool operator<(const Edge& other) const {return weight < other.weight;}
};class Graph {
public:int V; // 顶点数vector<Edge> edges; // 边的集合// 构造函数Graph(int v) : V(v) {}// 添加边void addEdge(int src, int dest, int weight) {Edge edge = {src, dest, weight};edges.push_back(edge);}// Prim算法实现void primMST() {vector<int> key(V, INT_MAX); // 用于存储顶点的键值vector<int> parent(V, -1);   // 用于存储MST中的父节点vector<bool> inMST(V, false); // 用于标记顶点是否在MST中// 从第一个顶点开始key[0] = 0;// 创建最小优先队列priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;pq.push({0, 0}); // {键值, 顶点}while (!pq.empty()) {int u = pq.top().second;pq.pop();inMST[u] = true;// 遍历u的邻居for (const Edge& edge : edges) {int v = (edge.src == u) ? edge.dest : edge.src;int weight = edge.weight;if (!inMST[v] && weight < key[v]) {key[v] = weight;parent[v] = u;pq.push({key[v], v});}}}// 输出MSTcout << "Prim MST:" << endl;for (int i = 1; i < V; ++i)cout << parent[i] << " - " << i << endl;}// Kruskal算法实现void kruskalMST() {// 对边按照权重进行排序sort(edges.begin(), edges.end());vector<int> parent(V, -1); // 用于存储每个集合的父节点// 查找根节点function<int(int)> find = [&](int i) {while (parent[i] != -1)i = parent[i];return i;};// 合并两个集合function<void(int, int)> unionSets = [&](int x, int y) {int rootX = find(x);int rootY = find(y);parent[rootX] = rootY;};// 输出MSTcout << "Kruskal MST:" << endl;for (const Edge& edge : edges) {int rootSrc = find(edge.src);int rootDest = find(edge.dest);// 如果加入这条边不会形成环,则加入MSTif (rootSrc != rootDest) {cout << edge.src << " - " << edge.dest << endl;unionSets(rootSrc, rootDest);}}}// Dijkstra算法实现void dijkstra(int src) {// 创建最小优先队列priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;vector<int> dist(V, INT_MAX); // 用于存储最短路径dist[src] = 0;pq.push({0, src});while (!pq.empty()) {int u = pq.top().second;pq.pop();for (const Edge& edge : edges) {if (edge.src == u) {int v = edge.dest;int weight = edge.weight;// 更新最短路径if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;pq.push({dist[v], v});}}}}// 输出最短路径cout << "Dijkstra Shortest Paths from vertex " << src << ":" << endl;for (int i = 0; i < V; ++i)cout << "To " << i << ": " << dist[i] << endl;}// Bellman-Ford算法实现void bellmanFord(int src) {vector<int> dist(V, INT_MAX); // 用于存储最短路径dist[src] = 0;// 松弛操作for (int i = 1; i < V; ++i) {for (const Edge& edge : edges) {int u = edge.src;int v = edge.dest;int weight = edge.weight;if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {dist[v] = dist[u] + weight;}}}// 检测负权环for (const Edge& edge : edges) {int u = edge.src;int v = edge.dest;int weight = edge.weight;if (dist[u] != INT_MAX && dist[u] + weight < dist[v]) {cout << "Graph contains negative weight cycle!" << endl;return;}}// 输出最短路径cout << "Bellman-Ford Shortest Paths from vertex " << src << ":" << endl;for (int i = 0; i < V; ++i)cout << "To " << i << ": " << dist[i] << endl;}// Floyd算法实现void floydWarshall() {vector<vector<int>> dist(V, vector<int>(V, INT_MAX));// 初始化邻接矩阵for (int i = 0; i < V; ++i)dist[i][i] = 0;for (const Edge& edge : edges)dist[edge.src][edge.dest] = edge.weight;// Floyd算法核心for (int k = 0; k < V; ++k) {for (int i = 0; i < V; ++i) {for (int j = 0; j < V; ++j) {if (dist[i][k] != INT_MAX && dist[k][j] != INT_MAX &&dist[i][k] + dist[k][j] < dist[i][j]) {dist[i][j] = dist[i][k] + dist[k][j];}}}}// 输出最短路径cout << "Floyd Shortest Paths:" << endl;for (int i = 0; i < V; ++i) {for (int j = 0; j < V; ++j) {cout << dist[i][j] << "\t";}cout << endl;}}
};int main() {Graph g(6);// 添加边g.addEdge(0, 1, 4);g.addEdge(0, 2, 3);g.addEdge(1, 2, 1);g.addEdge(1, 3, 2);g.addEdge(2, 3, 4);g.addEdge(3, 4, 2);g.addEdge(4, 5, 6);// 执行算法g.primMST();g.kruskalMST();g.dijkstra(0);g.bellmanFord(0);g.floydWarshall();return 0;
}

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

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

相关文章

闲聊从零开发一个2D数字人流程实战

.2D数字人技术 百度&#xff0c;腾讯&#xff0c;等大厂都有自己的数字平台制作&#xff08;套壳&#xff1a;api后台转发vue前端&#xff09;&#xff0c;国外也有出名的heygen&#xff08;非常厉害一个&#xff09;通过开源项目组合实现&#xff0c;再打通每个项目已api的形…

Redis概述

Redis是一款NoSql(非关系型)数据库&#xff0c;实现了主从同步。 使用场景&#xff1a; 对数据高并发的读写。 海量数据的读写。 对数据的可扩展性的。 NoSql数据库举例&#xff1a; Memcache&#xff1a;数据都在内存中&#xff0c;但是数据不持久化&#xff0c;而且只支…

ChatGPT助力高效办公——神奇的效率工具Airy

Airy是一款免费而又强大的高效办公软件&#xff0c;用户可以通过快捷键和丰富的内置插件&#xff0c;充分发挥GPT-3.5模型的强大功能&#xff0c;轻松实现搜索、翻译、文本生成与写作、文本概括与总结&#xff0c;同时还可以作为一款日程提醒工作&#xff0c;记录和提醒每天要做…

python之 flask 框架(2)项目拆分的 执行逻辑

项目的结构图 app.py # 导入__init__.py 比较特殊 from APP import create_appapp create_app() if __name__ __main__:app.run(debugTrue)init.py # __inti__.py # 初始化文件&#xff0c;创建Flask应用 from flask import Flask from .views import bluedef create_ap…

基于MS16F3211芯片的触摸控制灯的状态变化和亮度控制(11.15)

1.任务所需实现基本功能 关机状态时白灯亮蓝灯灭&#xff0c;此时长按按键无反应&#xff0c;白灯亮度降低的状态&#xff0c;蓝灯保持灭的状态。点按按键一次&#xff0c;白灯熄灭&#xff0c;蓝灯亮此时W引脚控制的灯亮。继续点按按键。蓝灯亮&#xff0c;此时W引脚控制的灯…

vue中ref的用法

vue中ref的用法 在项目中使用ref时有时候直接取值,有时候返回的却是一个数组,不知其中缘由,后查了一下ref用法,所以总结一下. 1.绑定在dom元素上时&#xff0c;用起来与id差不多&#xff0c;通过this.$refs来调用: <div id"passCarEchart" ref"passCarEch…

HDR 成像技术学习(四)

HDR(High Dynamic Range,高动态范围)仿佛是成像领域永恒的话题,动态范围越大,图像能清晰呈现的明暗差别也就越大。与传统的SDR(标准动态范围)相比,HDR图像能够以更高质量同时显示画面的亮部和暗部。 随这些年CMOS图像传感器工艺技术进步,以及后端数字信号处理算力的提升…

如何挑选护眼灯?光照均匀度、色温、眩光这3点!

光照环境对我们的生活质量影响深远&#xff0c;尤其在孩子的成长过程中&#xff0c;良好的光照环境对其学习效率、视力保护都至关重要。光照中的很多因素都对视力有着或大或小的影响&#xff0c;本文将从光照均匀度、眩光、色温三个关键点&#xff0c;深入浅出地让消费者了解其…

第28章_mysql缓存策略

文章目录 MySQL缓存方案目的分析缓存层作用举例 缓存方案选择场景分析 提升MySQL访问性能的方式MySQL主从复制读写分离连接池异步连接 缓存方案缓存和MySQL一致性状态分析制定读写策略 同步方案canalgo-mysql-transfer 缓存方案的故障问题及解决缓存穿透缓存击穿缓存雪崩缓存方…

TOUGH系列软件教程

查看原文>>>全流程TOUGH系列软件实践技术应用 TOUGH系列软件是由美国劳伦斯伯克利实验室开发的&#xff0c;旨在解决非饱和带中地下水、热运移的通用模拟软件。和传统地下水模拟软件Feflow和Modflow不同&#xff0c;TOUGH系列软件采用模块化设计和有限积分差网格剖分…

Python 获取北上广深历史天气数据并做数据可视化

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 知识点: 动态数据抓包 requests发送请求 结构化非结构化数据解析 开发环境: python 3.8 运行代码 pycharm 2022.3.2 辅助敲代码 专业版 requests 发送请求 pip install requests parsel 解析数据 pip install parsel …

k8s之Helm

理论&#xff1a; 什么是 He lm 在没使用 helm 之前&#xff0c;向 kubernetes 部署应用&#xff0c;我们要依次部署 deployment、svc 等&#xff0c;步骤较繁琐。 况且随着很多项目微服务化&#xff0c;复杂的应用在容器中部署以及管理显得较为复杂&#xff0c;helm 通过打包…