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

【Algorithm】图论入门

文章目录

  • 图论基础入门
    • 一、什么是图(Graph)
      • 分类:
    • 二、图的存储结构(C++ 实现)
      • 1. 邻接表(Adjacency List)
      • 2. 邻接矩阵(Adjacency Matrix)
    • 三、图的遍历
      • 1. 深度优先搜索(DFS)
      • 2. 广度优先搜索(BFS)
    • 四、经典图算法(C++ 实现)
      • 1. 拓扑排序(Topological Sort)——仅适用于有向无环图(DAG)
        • Kahn 算法(基于入度)
      • 2. 最短路径算法
        • Dijkstra(适用于正权图)
      • 3. 并查集(Union-Find)——用于连通性判断、Kruskal 算法
    • 五、应用场景

图论基础入门

图论(Graph Theory)是计算机科学中的核心基础之一,被广泛应用于算法设计、工程系统、人工智能、编译器、网络通信、地图导航等多个方向。


一、什么是图(Graph)

图是一种由顶点(Vertex)和边(Edge)组成的数据结构,用于表示元素之间的关系。

分类:

  • 有向图(Directed Graph):边具有方向,如 A → B。
  • 无向图(Undirected Graph):边无方向,A 与 B 相互连接。
  • 带权图(Weighted Graph):边携带权重信息。
  • 稀疏图 / 稠密图:根据边的数量与顶点的比例判断。

二、图的存储结构(C++ 实现)

1. 邻接表(Adjacency List)

适用于稀疏图,节省空间。

int n; // 顶点数量
vector<vector<int>> adj(n); // 无权图的邻接表// 添加一条有向边 u → v
adj[u].push_back(v);

带权图:

vector<vector<pair<int, int>>> adj(n); // pair<邻接点, 权重>adj[u].emplace_back(v, weight);

2. 邻接矩阵(Adjacency Matrix)

适用于稠密图,占用空间大但查询更快。

vector<vector<int>> matrix(n, vector<int>(n, 0));
matrix[u][v] = 1; // 表示 u → v 有边

三、图的遍历

1. 深度优先搜索(DFS)

void dfs(int u, vector<vector<int>>& adj, vector<bool>& visited) {visited[u] = true;for (int v : adj[u]) {if (!visited[v]) {dfs(v, adj, visited);}}
}

2. 广度优先搜索(BFS)

void bfs(int start, vector<vector<int>>& adj, vector<bool>& visited) {queue<int> q;visited[start] = true;q.push(start);while (!q.empty()) {int u = q.front(); q.pop();for (int v : adj[u]) {if (!visited[v]) {visited[v] = true;q.push(v);}}}
}

四、经典图算法(C++ 实现)

1. 拓扑排序(Topological Sort)——仅适用于有向无环图(DAG)

Kahn 算法(基于入度)
bool topoSort(int n, const vector<vector<int>>& adj, vector<int>& result) {vector<int> inDegree(n, 0);for (const auto& neighbors : adj)for (int v : neighbors) inDegree[v]++;
图论基础入门queue<int> q;for (int i = 0; i < n; ++i)if (inDegree[i] == 0) q.push(i);while (!q.empty()) {int u = q.front(); q.pop();result.push_back(u);for (int v : adj[u])if (--inDegree[v] == 0) q.push(v);}return result.size() == n; // false 表示有环
}

2. 最短路径算法

Dijkstra(适用于正权图)
vector<int> dijkstra(int n, int start, const vector<vector<pair<int, int>>>& adj) {vector<int> dist(n, INT_MAX);priority_queue<pair<int, int>, vector<pair<int, int>>, greater<>> pq;dist[start] = 0;pq.emplace(0, start);while (!pq.empty()) {auto [d, u] = pq.top(); pq.pop();if (d > dist[u]) continue;for (auto [v, w] : adj[u]) {if (dist[u] + w < dist[v]) {dist[v] = dist[u] + w;pq.emplace(dist[v], v);}}}return dist;
}

3. 并查集(Union-Find)——用于连通性判断、Kruskal 算法

struct UnionFind {vector<int> parent;UnionFind(int n) : parent(n) {iota(parent.begin(), parent.end(), 0);}int find(int x) {return parent[x] == x ? x : (parent[x] = find(parent[x]));}bool unite(int a, int b) {int pa = find(a), pb = find(b);if (pa == pb) return false;parent[pa] = pb;return true;}
};

五、应用场景

  • 编译依赖分析:如 Makefile 中的文件依赖。
  • 项目构建系统:如 CMake 中的模块拓扑。
  • 图数据库遍历:如 Neo4j 查询路径。
  • 地图导航系统:如最短路径搜索(Dijkstra、A*)。
  • 社交网络分析:好友推荐、社群划分。
  • 多线程任务调度系统:拓扑排序 + 优先级控制。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.dtcms.com/a/253086.html

相关文章:

  • 软件体系结构-论述、设计、问答
  • 每天一个前端小知识 Day 4 - TypeScript 核心类型系统与实践
  • 跨境卖家警报。抽绳背包版权案立案,TRO在即速排查
  • 二维数组 结构体01 day15,16
  • 【大模型:知识库管理】--MinerU本地部署
  • SpringBoot Starter设计:依赖管理的革命
  • 什么是数据清洗?数据清洗有哪些步骤?
  • 选择与方法专栏(9) 职场内篇: 是否要跳出舒适圈?如何处理犯错?
  • ffmpeg python rgba图片合成 4444格式mov视频,保留透明通道
  • 有趣的git
  • 【git】错误
  • 《深度学习基础与概念》task2/3
  • 使用 Java + WebSocket 实现简单实时双人协同 pk 答题
  • 设计模式精讲 Day 4:建造者模式(Builder Pattern)
  • Datawhale YOLO Master 第1次笔记
  • 提示词工程中常见协议框架应用实例
  • 开源 Arkts 鸿蒙应用 开发(二)封装库.har制作和应用
  • 基于若依框架编写的选人组件(vue3 + ts 版本)
  • PostgreSQL窗口函数测试
  • Docker 安装 Oracle 11G
  • Datawhale-爬虫
  • 论文笔记:Trajectory generation: a survey on methods and techniques
  • 【数据结构】图论实战:DAG空间压缩术——42%存储优化实战解析
  • Java线程池全面解析:原理、实现与最佳实践
  • 视频点播web端AI智能大纲(自动生成视频内容大纲)的代码与演示
  • APISIX 简介:云原生 API 网关的架构与实践
  • 提升教学演示效率:基于交互设计的电子教鞭解决方案
  • 【RocketMQ 生产者和消费者】- 消费者重平衡(1)
  • Scale AI 的王晓磊带着对整个 AI 行业动态的深入了解加入 Meta
  • Javascript的新能力:显式资源管理(Explicit Resource Management)