用C语言以邻接表作存储结构实现求从源点到其余各顶点的最短路径的 Dijkstra 法

时间: 2024-02-24 19:54:14 浏览: 28
好的,下面是用 C 语言实现 Dijkstra 算法的代码,以邻接表作为存储结构: ```c #include <stdio.h> #include <stdlib.h> #include <stdbool.h> #define MAX_VERTEX_NUM 100 // 图中顶点数的最大值 typedef struct EdgeNode { // 邻接表中的边结点 int adjvex; // 邻接点在顶点数组中的下标 int weight; // 边的权值 struct EdgeNode *next; // 指向下一个邻接点的指针 } EdgeNode; typedef struct VertexNode { // 邻接表中的顶点结点 int data; // 顶点的数据 EdgeNode *firstEdge; // 指向第一个邻接点的指针 } VertexNode, AdjList[MAX_VERTEX_NUM]; typedef struct { // 邻接表存储的图 AdjList adjList; // 存储每个顶点的邻接表 int vertexNum; // 图中顶点的数量 int edgeNum; // 图中边的数量 } Graph; void initGraph(Graph *graph) { int i; for (i = 0; i < MAX_VERTEX_NUM; i++) { graph->adjList[i].data = 0; graph->adjList[i].firstEdge = NULL; } graph->vertexNum = 0; graph->edgeNum = 0; } void addVertex(Graph *graph, int data) { graph->adjList[graph->vertexNum].data = data; graph->adjList[graph->vertexNum].firstEdge = NULL; graph->vertexNum++; } void addEdge(Graph *graph, int src, int dest, int weight) { EdgeNode *newEdge = (EdgeNode *) malloc(sizeof(EdgeNode)); newEdge->adjvex = dest; newEdge->weight = weight; newEdge->next = graph->adjList[src].firstEdge; graph->adjList[src].firstEdge = newEdge; graph->edgeNum++; } void dijkstra(Graph *graph, int start, int *dist, int *prev) { bool visited[MAX_VERTEX_NUM] = {false}; // 标记每个顶点是否已经访问过 int i, j, k, min; EdgeNode *p; for (i = 0; i < graph->vertexNum; i++) { dist[i] = INT_MAX; // 到每个顶点的距离初始化为无穷大 prev[i] = -1; // 每个顶点的前驱顶点初始化为 -1 } dist[start] = 0; // 源点到自身的距离为 0 for (i = 0; i < graph->vertexNum; i++) { min = INT_MAX; for (j = 0; j < graph->vertexNum; j++) { if (!visited[j] && dist[j] < min) { min = dist[j]; k = j; } } visited[k] = true; // 标记顶点 k 已经访问过 for (p = graph->adjList[k].firstEdge; p != NULL; p = p->next) { j = p->adjvex; if (!visited[j] && dist[k] + p->weight < dist[j]) { dist[j] = dist[k] + p->weight; // 更新源点到 j 的最短距离 prev[j] = k; // j 的前驱顶点为 k } } } } int main() { Graph graph; initGraph(&graph); addVertex(&graph, 0); addVertex(&graph, 1); addVertex(&graph, 2); addVertex(&graph, 3); addEdge(&graph, 0, 1, 10); addEdge(&graph, 0, 3, 5); addEdge(&graph, 1, 2, 1); addEdge(&graph, 1, 3, 2); addEdge(&graph, 2, 3, 4); int dist[MAX_VERTEX_NUM]; // 存储源点到每个顶点的最短距离 int prev[MAX_VERTEX_NUM]; // 存储每个顶点的前驱顶点 dijkstra(&graph, 0, dist, prev); printf("源点到各顶点的最短距离:\n"); int i; for (i = 0; i < graph.vertexNum; i++) { printf("%d ", dist[i]); } printf("\n各顶点的前驱顶点:\n"); for (i = 0; i < graph.vertexNum; i++) { printf("%d ", prev[i]); } printf("\n"); return 0; } ``` 其中,initGraph()、addVertex() 和 addEdge() 分别用于初始化图、添加顶点和添加边。 dijkstra() 函数用于求解从源点 start 到其余各顶点的最短路径。其中,dist 数组存储源点到每个顶点的最短距离,prev 数组存储每个顶点的前驱顶点。 在 main() 函数中,我们创建了一个包含 4 个顶点和 5 条边的图,并以顶点 0 为源点调用 dijkstra() 函数进行求解。 希望这个代码可以帮助到你。

相关推荐

最新推荐

recommend-type

node-v6.9.4-linux-s390x.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

node-v6.15.0-linux-arm64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

1694jsp宿舍管理系统Myeclipse开发mysql数据库web结构java编程计算机网页项目源码

一、源码特点 JSP 宿舍管理系统 是一套完善的web设计系统,对理解JSP java编程开发语言有帮助,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 二、功能介绍 如博客中介绍, 三、注意事项 1、管理员账号:admin 密码:admin 数据库配置文件DBO.java ,权限包括管理员,学生 2、开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。 3、数据库文件名是jspsushe 系统名称sushe 4、地址:http://127.0.0.1:8080/sushe/login.jsp 不包含人工服务,如果需要调试,联系作者购买
recommend-type

node-v4.7.1-sunos-x64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

node-v6.5.0-linux-ppc64.tar.xz

Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。
recommend-type

zigbee-cluster-library-specification

最新的zigbee-cluster-library-specification说明文档。
recommend-type

管理建模和仿真的文件

管理Boualem Benatallah引用此版本:布阿利姆·贝纳塔拉。管理建模和仿真。约瑟夫-傅立叶大学-格勒诺布尔第一大学,1996年。法语。NNT:电话:00345357HAL ID:电话:00345357https://theses.hal.science/tel-003453572008年12月9日提交HAL是一个多学科的开放存取档案馆,用于存放和传播科学研究论文,无论它们是否被公开。论文可以来自法国或国外的教学和研究机构,也可以来自公共或私人研究中心。L’archive ouverte pluridisciplinaire
recommend-type

实现实时数据湖架构:Kafka与Hive集成

![实现实时数据湖架构:Kafka与Hive集成](https://img-blog.csdnimg.cn/img_convert/10eb2e6972b3b6086286fc64c0b3ee41.jpeg) # 1. 实时数据湖架构概述** 实时数据湖是一种现代数据管理架构,它允许企业以低延迟的方式收集、存储和处理大量数据。与传统数据仓库不同,实时数据湖不依赖于预先定义的模式,而是采用灵活的架构,可以处理各种数据类型和格式。这种架构为企业提供了以下优势: - **实时洞察:**实时数据湖允许企业访问最新的数据,从而做出更明智的决策。 - **数据民主化:**实时数据湖使各种利益相关者都可
recommend-type

机器学习怎么将excel转为csv文件

机器学习是一种利用计算机算法和统计数据的方法来训练计算机来进行自动学习的科学,无法直接将excel文件转为csv文件。但是可以使用Python编程语言来读取Excel文件内容并将其保存为CSV文件。您可以使用Pandas库来读取Excel文件,并使用to_csv()函数将其保存为CSV格式。以下是代码示例: ```python import pandas as pd # 读取 Excel 文件 excel_data = pd.read_excel('example.xlsx') # 将数据保存为 CSV 文件 excel_data.to_csv('example.csv', index=
recommend-type

JSBSim Reference Manual

JSBSim参考手册,其中包含JSBSim简介,JSBSim配置文件xml的编写语法,编程手册以及一些应用实例等。其中有部分内容还没有写完,估计有生之年很难看到完整版了,但是内容还是很有参考价值的。