【图论】图的C++实现代码

在这个例程中我们用类实现了节点、(无向图)连边、无向图,实现了节点度的计算、无向图聚类系数计算、度分布统计、无向图的Dijkstra算法(已知起止点计算最短路的算法)

#include <iostream>
#include<vector>
#include<set>
#include<unordered_map>
using namespace std;class Edge
{
public:int v1;int v2;int weight;Edge(int v1, int v2, int w){this->v1 = v1;this->v2 = v2;this->weight = w;}
};class DJPathInfo // 存放已知最短路
{
public:vector<vector<int>> shortest_path;vector<int> shortest_path_len;DJPathInfo(int n){vector<int> empty;this->shortest_path=vector<vector<int>>(n, empty);this->shortest_path_len= vector<int>(n, 0);}
};class Node
{
public:std::vector<Edge> edges;int id;Node(int i){this->id = i;}int degree(){return this->edges.size();}vector<int> neighbors(){vector<int> res;if (this->edges.size() > 0){for (auto edge : this->edges){if (edge.v1 == this->id) res.push_back(edge.v2);else res.push_back(edge.v1);}return res;}else return res;}float cluster_coeff(vector<vector<bool>> adj_mat){int num_neighbor = this->edges.size() - 1;if (num_neighbor < 2) return 0;vector<int> neighbors = this->neighbors();float E = 0; //邻居之间的边数for (auto i : neighbors){for (auto j : neighbors){if (i >= j) continue;if (adj_mat[i][j] == true) E++;}}cout << 2 * E / (neighbors.size() * (neighbors.size() - 1)) << endl;return 2 * E / (neighbors.size() * (neighbors.size() - 1));}
};class Graph
{
public:vector<vector<bool>> adj_mat;vector<vector<float>> w_mat;int node_num;vector<Edge> edges;vector<Node> nodes;Graph(vector<vector<bool>> A, vector<vector<float>> W){this->adj_mat = A;this->w_mat = W;this->node_num = A.size();for (int i = 0; i < node_num; i++) this->nodes.push_back(Node(i));for (int i = 0; i < node_num; i++)for (int j = 0; j < i; j++){if (A[i][j] == true) this->add_edge(i, j, W[i][j]);}}Graph(int n){vector<float> zero(n, 0);vector<bool> all_false(n, false);vector<vector<bool>> A(n, all_false);vector<vector<float>> W(n, zero);this->adj_mat = A;this->w_mat = W;this->node_num = A.size();for (int i = 0; i < node_num; i++) this->nodes.push_back(Node(i));for (int i = 0; i < node_num; i++)for (int j = 0; j < i; j++){if (A[i][j] == true) this->add_edge(i, j, W[i][j]);}}void add_edge(int id1, int id2, int weight){Edge e = Edge(id1, id2, weight);this->adj_mat[id1][id2] = true;this->adj_mat[id2][id1] = true;this->w_mat[id1][id2] = weight;this->w_mat[id2][id1] = weight;this->edges.push_back(e);this->nodes[id1].edges.push_back(e);this->nodes[id2].edges.push_back(e);}void tell_info(){for (auto v : this->nodes){std::cout << "Node ID:" << v.id << std::endl;std::cout << "Neighbor/Weight:";for (auto i : v.neighbors()) cout <<'(' << i<<','<< this->w_mat[v.id][i] << ')' << ',';std::cout<<std::endl;}}vector<int> DJ(int s, int dest) // Dijkstra算法{DJPathInfo info(this->nodes.size());vector<int> res = {s};set<int> S;S.insert(s);set<int> U;for (auto v : this->nodes[s].neighbors()) U.insert(v);if (U.size() == 0) return res;for (auto v : U){info.shortest_path[v].push_back(v);info.shortest_path_len[v] = this->w_mat[s][v];}info.shortest_path_len[s] = 0;while (U.size() != 0){int n = *U.begin();int n_len = info.shortest_path_len[n];for (auto it = U.begin(); it != U.end(); it++){if (info.shortest_path_len[n] > info.shortest_path_len[*it]){n = *it;n_len = info.shortest_path_len[*it];}}S.insert(n);U.erase(n);for (auto v : this->nodes[n].neighbors()){if (S.find(v) != S.end()) continue;U.insert(v);if (info.shortest_path[v].size() == 0){info.shortest_path[v] = info.shortest_path[n];info.shortest_path[v].push_back(v);info.shortest_path_len[v] = info.shortest_path_len[n] + this->w_mat[n][v];continue;}if (info.shortest_path_len[n] + this->w_mat[n][v] < info.shortest_path_len[v]){info.shortest_path[v] = info.shortest_path[n];info.shortest_path[v].push_back(v);info.shortest_path_len[v] = info.shortest_path_len[n] + this->w_mat[n][v];}}}if (S.find(dest) != S.end()){for (auto v : info.shortest_path[dest]) res.push_back(v);info.shortest_path_len[dest];}return res;}float cluster_coeff(){float res=0;for (auto node : this->nodes) res += node.cluster_coeff(this->adj_mat);return res / float(this->nodes.size());}void degree_distribution() // 度分布{vector<float> res;unordered_map<int, int> degree_count;for (auto v : this->nodes){degree_count.emplace(v.degree(), 0);}for (auto v : this->nodes){degree_count[v.degree()]++;}for (auto it : degree_count){std::cout << "degree =" << it.first << ', '<<" prob=" << float(it.second) / this->nodes.size() << endl;}}
};int main()
{Graph G = Graph(11);G.add_edge(0, 1, 2);G.add_edge(0, 2, 9);G.add_edge(0, 3, 1);G.add_edge(1, 4, 1);G.add_edge(1, 2, 6);G.add_edge(2, 4, 5);G.add_edge(2, 5, 1);G.add_edge(2, 6, 2);G.add_edge(2, 3, 7);G.add_edge(3, 6, 9);G.add_edge(4, 7, 2);G.add_edge(4, 8, 9);G.add_edge(4, 5, 3);G.add_edge(5, 8, 6);G.add_edge(5, 6, 4);G.add_edge(6, 8, 3);G.add_edge(6, 9, 1);G.add_edge(7, 8, 7);G.add_edge(7, 10, 9);G.add_edge(8, 10, 2);G.add_edge(8, 9, 1);G.add_edge(9, 10, 4);G.tell_info();cout << "Djkstra Test: shortest 0 -> 10: ";for (const auto& p : G.DJ(0, 10)) cout << p << ',';cout<<endl;cout << "clustring coefficient=" << G.cluster_coeff() << endl;cout << "degree distribution:"  << endl;G.degree_distribution();return 0;
}

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

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

相关文章

软件测试 软考

在软件测试中&#xff0c;覆盖准则是衡量测试用例是否充分覆盖程序各个部分的标准。不同的覆盖准则有不同的强度。按覆盖强度从低到高排序&#xff0c;常见的覆盖准则如下&#xff1a; 语句覆盖&#xff08;Statement Coverage&#xff09;&#xff1a;要求测试用例至少执行一次…

DirectShow过滤器开发-写AVI视频文件过滤器

下载本过滤器DLL 本过滤器将视频流和音频流写入AVI视频文件。 过滤器信息 过滤器名称&#xff1a;写AVI 过滤器GUID&#xff1a;{2EF49957-37DF-4356-A2A0-ECBC52D1984B} DLL注册函数名&#xff1a;DllRegisterServer 删除注册函数名&#xff1a;DllUnregisterServer 过滤器有…

uniapp实现H5和微信小程序获取当前位置(腾讯地图)

之前的一个老项目&#xff0c;使用 uniapp 的 uni.getLocation 发现H5端定位不准确&#xff0c;比如余杭区会定位到临平区&#xff0c;根据官方文档初步判断是项目的uniapp的版本太低。 我选择的方式不是区更新uniapp的版本&#xff0c;是直接使用高德地图的api获取定位。 1.首…

【WRF理论第七期】WPS预处理

【WRF理论第七期】WPS预处理 运行WPS&#xff08;Running the WPS&#xff09;步骤1&#xff1a;Define model domains with geogrid步骤2&#xff1a;Extracting meteorological fields from GRIB files with ungrib步骤3&#xff1a;Horizontally interpolating meteorologic…

机器学习(一)——基本概念、模型的评估与选择

目录 1 关于2 概念2.1 基础概念2.2 学习过程2.3 预测与评估2.4 标记与分类2.4.1 标记2.4.2 分类 2.5 回归分析2.6 聚类分析2.7 学习类型2.8 泛化能力2.9 统计学概念 3 模型评估与选择3.1 经验误差与过拟合3.2 评估方法3.2.1 留出法3.2.2 交叉验证法3.2.3 自助法3.2.4 调参与最终…

小白docker入门简介

Dockerfile入门使用分享 一、docker是啥二、镜像仓库三、自定义镜像四、动手做机甲玩偶五、帮我做数学题六、计算功能的写法七、咒语翻译器八、放屁九、解决问题 一、docker是啥 最开始我和你一样&#xff0c;围着镜像、容器、docker的名词团团转&#xff0c;其实没那么复杂。…

gitlab无法创建合并请求是所有分支都不显示

点击Merge Requests ------> New merge request 创建新的合并请求时&#xff0c;在Source branch和Target branch中一个分支都不显示 排查思路&#xff1a; 1.怀疑是权限问题。 发现只有我的一个账号出现&#xff0c;检查了账号的权限&#xff0c;尝试了master、develop角色…

macOS15.1及以上系统bug:开发者证书无法打开,钥匙串访问无法打开一直出现图标后立马闪退

团队紧跟苹果最新系统发现bug:今日设备信息如下,希望能带给遇到这个问题的开发者一点帮助。 错误图如下: 点击证书文件后,先出现钥匙串访问图标,后立马闪退消失 中间试过很多方法,都是一样的表现,最后好在解决了,看网上也没有相关的帖子,这里直接写解决办法和导致原因…

python实战案例——爬取A站视频,m3u8格式视频抓取(内含完整代码!)

1、任务目标 目标网站&#xff1a;A站视频&#xff08;https://www.acfun.cn/v/ac40795151&#xff09; 要求&#xff1a;抓取该网址下的视频&#xff0c;将其存入本地&#xff0c;视频如下&#xff1a; 2、网页分析 进入目标网站&#xff0c;打开开发者模式&#xff0c;我们发…

【基于轻量型架构的WEB开发】课程 12.4 页面跳转 Java EE企业级应用开发教程 Spring+SpringMVC+MyBatis

12.4 页面跳转 12.4.1 返回值为void类型的页面跳转 返回值为void类型的页面跳转到默认页面 当Spring MVC方法的返回值为void类型&#xff0c;方法执行后会跳转到默认的页面。默认页面的路径由方法映射路径和视图解析器中的前缀、后缀拼接成&#xff0c;拼接格式为“前缀方法…

濮良贵《机械设计》第十版课后习题答案全解PDF电子版

《机械设计》(第十版)是“十二五”普通高等教育本科国家级规划教材&#xff0c; 是在《机械设计》(第九版)的基础上修订而成的。本次修订主要做了以下几项工作&#xff1a; 1. 内容的适当更新——自本书第九版出版以来&#xff0c; 机械工程及相关领域的新理论、新技术和新标准…

【Unity基础】Unity中如何导入字体?

在Unity中&#xff0c;不能像其他软件一样直接使用字体文件&#xff0c;需要通过FontAssetCreator将其转换成Texture的Asset文件&#xff0c;然后才能使用。 本文介绍了使用FontAssetCreator导入字体的过程&#xff0c;并对其参数设置进行了说明。 Font Asset Creator 是 Uni…

2024年11月8日上海帆软用户大会

2024年11月8日上海帆软用户大会 2024年11月8日&#xff0c;上海成功举办了帆软用户大会&#xff0c;主题为“数字聚力&#xff0c;绽放新机”。大会汇聚了众多行业专家和企业代表&#xff0c;共同探讨数字化转型和商业智能领域的最新趋势和实践。 大会亮点&#xff1a; 专家…

注意力机制的目的:理解语义;编码器嵌入高纬空间计算;注意力得分“得到S*V”;解码器掩码和交叉注意力层用于训练;最终的编码器和输出实现大模型

目录 注意力机制的目的:理解语义中的它是小白兔 词编码器嵌入高纬空间 计算注意力得分“得到S*V” 权重QKV:连接权重 训练阶段使用解码器:翻译后的语句 解码器掩码和交叉注意力层用于训练 最终的编码器和输出实现大模型 Transformer模型中,QKV QKV的作用 举例说明…

纯前端实现在线预览excel文件(插件: LuckyExcel、Luckysheet)

概述 在实际开发中&#xff0c;遇到需要在线预览各种文件的需求&#xff0c;最近遇到在线预览excel文件的需求&#xff0c;在此记录一下&#xff01;本文主要功能实现&#xff0c;用于插件 LuckyExcel &#xff0c;Luckysheet&#xff01;废话不多说&#xff0c;上代码&#xf…

WPF自定义翻页控件

XAML文件如下&#xff1a; <UserControlx:Class"CTMVVMDemo.View.UserControls.DataPager"xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d"http://s…

Linux中.NET读取excel组件,不会出现The type initializer for ‘Gdip‘ threw an exception异常

组件&#xff0c;可通过nuget安装&#xff0c;直接搜名字&#xff1a; ExcelDataReader using ConsoleAppReadFileData.Model; using ExcelDataReader; using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Task…

qt QColorDialog详解

1、概述 QColorDialog是Qt框架中的一个对话框类&#xff0c;专门用于让用户选择颜色。它提供了一个标准的颜色选择界面&#xff0c;其中包括基本的颜色选择器&#xff08;如调色板和颜色轮&#xff09;、自定义颜色输入区域以及预定义颜色列表。QColorDialog支持RGB、HSV和十六…

使用Python实现音频降噪

在音频处理领域&#xff0c;背景噪声是一个常见的问题。为了提高音频的质量&#xff0c;我们需要对音频进行降噪处理。本文将介绍如何使用 Python 实现音频降噪。 依赖库安装 在开始之前&#xff0c;我们需要安装以下依赖库&#xff1a; pydub&#xff1a;用于音频文件的读取…

【WRF模拟】全过程总结:WPS预处理及WRF运行

【WRF模拟】全过程总结:WPS预处理及WRF运行 1 数据准备1.1 嵌套域设置(Customize domain)-基于QGis中gis4wrf插件1.2 静态地理数据1.2.1 叶面积指数LAI和植被覆盖度Fpar(月尺度)1.2.2 地面反照率(月尺度)1.2.3 土地利用类型+不透水面积1.2.4 数据处理:geotiff→tiff(W…