图论1(c++)
图论1C图论是计算机科学中研究图结构及其应用的数学分支在算法设计、网络分析、人工智能等领域具有广泛的应用。本文将深入剖析图论的核心概念包括图的表示、遍历算法DFS和BFS并提供可运行的C代码示例帮助读者从原理到实践全面掌握图论基础。## 图的基本概念与表示图由顶点Vertex和边Edge组成通常表示为G(V, E)其中V是顶点集E是边集。根据边的方向性图分为有向图和无向图根据边是否带权重分为有权图和无权图。在C中图的表示方法主要有两种-邻接矩阵使用二维数组int graph[n][n]graph[i][j]表示顶点i到j的边是否存在或权重。适用于稠密图但空间复杂度为O(V²)。-邻接表使用vectorint adj[n]或vectorvectorint adj每个顶点维护一个相邻顶点列表。适用于稀疏图空间复杂度为O(VE)。邻接表是实际开发中最常用的表示方法因为大多数图都是稀疏的。下面是一个使用邻接表表示有向图的C代码示例cpp#include iostream#include vectorusing namespace std;// 使用邻接表表示有向图class Graph {private: int V; // 顶点数 vectorvectorint adj; // 邻接表public: // 构造函数初始化顶点数和邻接表 Graph(int vertices) : V(vertices) { adj.resize(V); } // 添加有向边从u到v void addEdge(int u, int v) { adj[u].push_back(v); // 将v加入u的邻接表 } // 打印图的邻接表 void printGraph() { cout Graph Adjacency List: endl; for (int i 0; i V; i) { cout Vertex i : ; for (int neighbor : adj[i]) { cout neighbor ; } cout endl; } }};int main() { // 创建一个包含5个顶点的图 Graph g(5); // 添加边 g.addEdge(0, 1); g.addEdge(0, 4); g.addEdge(1, 2); g.addEdge(1, 3); g.addEdge(2, 3); g.addEdge(3, 4); // 打印图 g.printGraph(); return 0;}这段代码演示了如何用邻接表构建一个有向图。运行后输出将显示每个顶点的邻接列表例如顶点0连接1和4。## 深度优先搜索DFS原理与实现深度优先搜索Depth-First SearchDFS是一种沿着一条路径尽可能深入搜索的算法直到无法继续才回溯。其核心原理是使用栈递归或显式栈来跟踪路径确保每个顶点只被访问一次。### 算法原理1. 从起始顶点开始标记为已访问。2. 递归地访问当前顶点的每个未访问邻接顶点。3. 如果当前顶点没有未访问的邻接顶点则回溯到上一个顶点。4. 重复直到所有可达顶点都被访问。DFS的时间复杂度为O(VE)空间复杂度为O(V)递归栈深度。它常用于拓扑排序、连通分量检测、迷宫求解等场景。### C实现示例下面是一个完整的DFS遍历实现包含递归版本和迭代版本使用显式栈cpp#include iostream#include vector#include stackusing namespace std;// 深度优先搜索类class DFSGraph {private: int V; vectorvectorint adj; // 递归辅助函数 void DFSUtil(int v, vectorbool visited) { // 标记当前顶点为已访问并打印 visited[v] true; cout v ; // 递归访问所有未访问的邻接顶点 for (int neighbor : adj[v]) { if (!visited[neighbor]) { DFSUtil(neighbor, visited); } } }public: DFSGraph(int vertices) : V(vertices) { adj.resize(V); } void addEdge(int u, int v) { adj[u].push_back(v); // 有向图 } // 递归DFS从顶点0开始 void DFSRecursive(int start) { vectorbool visited(V, false); cout DFS Recursive (start start ): ; DFSUtil(start, visited); cout endl; } // 迭代DFS使用显式栈 void DFSIterative(int start) { vectorbool visited(V, false); stackint s; s.push(start); cout DFS Iterative (start start ): ; while (!s.empty()) { int v s.top(); s.pop(); // 如果顶点未访问则标记并处理 if (!visited[v]) { visited[v] true; cout v ; // 将邻接顶点逆序入栈保持与递归相同的顺序 for (auto it adj[v].rbegin(); it ! adj[v].rend(); it) { if (!visited[*it]) { s.push(*it); } } } } cout endl; }};int main() { // 创建一个图 DFSGraph g(6); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); g.addEdge(2, 5); g.addEdge(3, 4); // 执行两种DFS g.DFSRecursive(0); g.DFSIterative(0); return 0;}运行此代码输出将显示DFS从顶点0开始的遍历顺序递归和迭代版本结果一致例如0 1 3 4 2 5。注意迭代版本中逆序入栈是为了模拟递归的访问顺序。## 广度优先搜索BFS原理与实现广度优先搜索Breadth-First SearchBFS是一种逐层扩展搜索的算法类似于树的层序遍历。其核心原理是使用队列来管理待访问的顶点确保按距离递增顺序遍历。### 算法原理1. 从起始顶点开始标记为已访问并加入队列。2. 从队列中取出一个顶点访问其所有未访问的邻接顶点标记后加入队列。3. 重复直到队列为空。BFS的时间复杂度同样为O(VE)空间复杂度为O(V)队列大小。它常用于最短路径无权图、连通分量、网络广播等场景。### C实现示例下面是一个完整的BFS实现包含从单源点开始的遍历cpp#include iostream#include vector#include queueusing namespace std;// 广度优先搜索类class BFSGraph {private: int V; vectorvectorint adj;public: BFSGraph(int vertices) : V(vertices) { adj.resize(V); } void addEdge(int u, int v) { adj[u].push_back(v); adj[v].push_back(u); // 无向图添加双向边 } // 从顶点start开始进行BFS void BFS(int start) { vectorbool visited(V, false); queueint q; // 初始化标记起始顶点并加入队列 visited[start] true; q.push(start); cout BFS (start start ): ; while (!q.empty()) { int v q.front(); q.pop(); cout v ; // 遍历所有未访问的邻接顶点 for (int neighbor : adj[v]) { if (!visited[neighbor]) { visited[neighbor] true; q.push(neighbor); } } } cout endl; } // 带距离计算的BFS返回从start到所有顶点的最短距离 vectorint BFSWithDistance(int start) { vectorint distance(V, -1); // -1表示不可达 queueint q; distance[start] 0; q.push(start); while (!q.empty()) { int v q.front(); q.pop(); for (int neighbor : adj[v]) { if (distance[neighbor] -1) { distance[neighbor] distance[v] 1; q.push(neighbor); } } } return distance; }};int main() { // 创建一个无向图 BFSGraph g(6); g.addEdge(0, 1); g.addEdge(0, 2); g.addEdge(1, 3); g.addEdge(2, 4); g.addEdge(2, 5); g.addEdge(3, 4); // 执行BFS g.BFS(0); // 计算并打印距离 vectorint dist g.BFSWithDistance(0); cout Distances from vertex 0: endl; for (int i 0; i dist.size(); i) { cout Distance to i : dist[i] endl; } return 0;}运行此代码BFS输出将从0开始按层次遍历例如0 1 2 3 4 5距离数组显示每个顶点到0的最短边数如顶点4距离为2。## 总结本文深入剖析了图论的核心概念和基础算法重点讲解了图的邻接表表示、深度优先搜索DFS和广度优先搜索BFS的原理与实现。通过可运行的C代码示例读者可以直观理解两种遍历算法的差异DFS适合探索路径的深度和回溯常用于拓扑排序、连通分量等问题BFS则按层次扩展特别适合求解无权图的最短路径。掌握这些基础是学习更高级图算法如Dijkstra、Kruskal、Floyd-Warshall等的前提。在实际开发中选择合适的图表示和遍历策略能显著提升算法效率例如邻接表用于稀疏图邻接矩阵用于需要快速边查询的稠密图。希望本文能为读者在图论学习的道路上打下坚实基础。

相关新闻

CAD2025安装教程:Win10/Win11系统稳定安装与问题排查指南

CAD2025安装教程:Win10/Win11系统稳定安装与问题排查指南

1. 先搞清楚 CAD2025 的安装到底在解决什么问题 如果你正在找 CAD2025 的安装教程,大概率是遇到了这几个情况之一:要么是工作需要,必须用最新版;要么是旧版本在 Win11 或 Win10 上跑起来总出问题,想换个稳定的;再或者,就是被网上各种“免费下载”和“一键安装”的说法给…

2026/7/25 4:33:59阅读更多 →
AI写推荐信的致命误区:87%用户踩中的“人格稀释”雷区,及5步反向提示工程修复方案

AI写推荐信的致命误区:87%用户踩中的“人格稀释”雷区,及5步反向提示工程修复方案

更多请点击: https://intelliparadigm.com 第一章:AI写推荐信的致命误区:87%用户踩中的“人格稀释”雷区,及5步反向提示工程修复方案 什么是人格稀释? 人格稀释指AI生成的推荐信在过度追求“专业性”与“通用性”时&…

2026/7/25 4:33:59阅读更多 →
基于LLamaFactory与Qwen3-VL-8B的医疗多模态AI诊断实践

基于LLamaFactory与Qwen3-VL-8B的医疗多模态AI诊断实践

1. 项目背景与核心价值医疗行业长期面临专业人才稀缺、诊断效率低下和偏远地区资源不足的痛点。传统AI医疗方案通常局限于单一模态(如纯文本或图像分析),难以模拟医生综合判断的认知过程。这个项目通过整合LLamaFactory框架与Qwen3-VL-8B多模…

2026/7/25 4:31:58阅读更多 →
C++模板进阶:从分离编译到可变参数模板的实战解析

C++模板进阶:从分离编译到可变参数模板的实战解析

1. 模板进阶:从“能用”到“精通”的蜕变在C的世界里,模板(Template)绝对是一个让人又爱又恨的特性。爱它,是因为它提供了无与伦比的代码复用能力和编译期多态,是泛型编程的基石,STL和Boost库的…

2026/7/25 5:52:15阅读更多 →
影刀RPA 配置中心设计:流程参数集中管理

影刀RPA 配置中心设计:流程参数集中管理

影刀RPA 配置中心设计:流程参数集中管理 署名:林焱 什么情况用 你的RPA流程里有20个参数:数据库地址、账号密码、网页URL、超时时间、文件路径……散落在各个组件里。改一个数据库地址,要翻遍整个流程找哪里用了旧地址。更惨的是&…

2026/7/25 5:52:15阅读更多 →
影刀RPA 邮件合并:批量发送个性化邮件的完整方案

影刀RPA 邮件合并:批量发送个性化邮件的完整方案

影刀RPA 邮件合并:批量发送个性化邮件的完整方案 作者:林焱 需要给客户发500封邮件,每封的内容不一样(收件人姓名、金额、订单号都不同)。这就是邮件合并——用模板数据源,自动生成个性化邮件并发送。 邮…

2026/7/25 5:52:15阅读更多 →
Jaws:从零构建一个”五脏俱全”的 Java RPC 框架

Jaws:从零构建一个”五脏俱全”的 Java RPC 框架

在 Java RPC 的世界里,Dubbo 和 gRPC 早已是家喻户晓的名字。但当你真正去读它们的源码时,往往会陷入几十万行代码的汪洋——核心逻辑被淹没在大量的兼容性代码、扩展点和历史包袱中。 如果你渴望有一个 RPC 框架,代码量可控、架构清晰、每一…

2026/7/25 5:52:15阅读更多 →
Java后端面试题大全(整理版·附答案详解),最全面详细

Java后端面试题大全(整理版·附答案详解),最全面详细

Java 面试 Java 作为编程语言中的 NO.1,选择入行做 IT 做编程开发的人,基本都把它作为首选语言,进大厂拿高薪也是大多数小伙伴们的梦想。以前 Java 岗位人才的空缺,而需求量又大,所以这种人才供不应求的现状,就是 Java 工程师的薪…

2026/7/25 5:52:15阅读更多 →
042-学英语二语法的费曼式理解

042-学英语二语法的费曼式理解

费曼学习法系列 第042篇 用费曼学习法学英语(二):语法的费曼式理解 一、语法不是规则,是"语言的使用习惯" 大多数人在学校学的语法是一套"规则体系":第三人称单数加s、过去式加ed、现在完成时用have+过去分词……这些规则越积越多,到后来你发现总…

2026/7/25 5:50:14阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/25 1:01:14阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/25 1:01:14阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/25 1:01:14阅读更多 →
突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存

突破文档下载限制:kill-doc让你看到的都能保存 【免费下载链接】kill-doc 看到经常有小伙伴们需要下载一些免费文档,但是相关网站浏览体验不好各种广告,各种登录验证,需要很多步骤才能下载文档,该脚本就是为了解决您的…

2026/7/25 0:01:16阅读更多 →
C++ string类模拟实现:从深拷贝到内存管理的完整指南

C++ string类模拟实现:从深拷贝到内存管理的完整指南

1. 项目概述:为什么我们要“手撕”string类?在C的学习道路上,尤其是从C语言过渡到C的“初阶”阶段,string类绝对是一个绕不开的核心。标准库里的std::string用起来太方便了,、find、substr,几个操作符和函数…

2026/7/25 0:01:16阅读更多 →
三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

三角洲寻宝鼠工具:高效文件搜索与资源管理实战指南

1. 先搞清楚“三角洲寻宝鼠”到底是什么工具从名称来看,“三角洲寻宝鼠”更像是一个资源查找或文件检索类工具,而不是游戏或娱乐软件。这类工具的核心价值在于帮助用户快速定位特定资源,比如文档、图片、压缩包或特定格式的文件。如果你经常需…

2026/7/25 0:01:16阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/24 23:01:03阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/24 19:00:40阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/24 19:00:40阅读更多 →