热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

动态问题求最短路径c语言程序,Dijkstra算法求最短路径问题完整C代码

*Dijkstra算法求图的最短路径问题C代码*#include#include#include#defineMaxSize20#defineINFINITY65535typede

/* Dijkstra算法求图的最短路径问题C代码 */

#include

#include

#include

#define MaxSize 20

#define INFINITY 65535

typedef char VertexType;

//定义图 的邻接矩阵表示法结构

typedef struct Graph {

VertexType ver[MaxSize+1];

int edg[MaxSize][MaxSize];

}Graph;

//邻接矩阵法图的生成函数

void CreateGraph( Graph *g )

{

int i = 0;

int j = 0;

int VertexNum;

VertexType Ver;

printf("请输入图的顶点:\n");

while( '\n' != (Ver=getchar()) )

g->ver[i++] = Ver;

g->ver[i] = '\0';

VertexNum = strlen(g->ver);

printf("请输入相应的的邻接矩阵:\n");

for( i=0; i

for( j=0; j

scanf("%d", &g->edg[i][j]);

}

//打印图的结点标识符和邻接矩阵

void PrintGraph( Graph g )

{

int i, j;

int VertexNum = strlen(g.ver);

printf("图的顶点为:\n");

for( i=0; i

printf("%c ", g.ver[i]);

printf("\n");

printf("图的邻接矩阵为:\n");

for( i=0; i

for( j=0; j

printf("%d ", g.edg[i][j]);

printf("\n");

}

}

//求图的顶点数

int CalVerNum( Graph g )

{

return strlen(g.ver);

}

//将不邻接的顶点之间的权值设置为INFINITY

void SetWeight( Graph *g )

{

for( int i=0; i

for( int j=0; j

if( 0 == g->edg[i][j] )

g->edg[i][j] = INFINITY;

}

//Dijkstra求最短路径函数

void Dijkstra( Graph g )

{

int VertexNum = CalVerNum( g );

int j;

int mini;

int index = 0;

int *used = (int *)malloc(sizeof(int)*VertexNum);

int *distance = (int *)malloc(sizeof(int)*VertexNum);

int *parent = (int *)malloc(sizeof(int)*VertexNum);

int *last = (int *)malloc(sizeof(int)*VertexNum);

SetWeight( &g );//设置权值

for( int i=0; i

used[i] = 0;

distance[i] = g.edg[0][i]; //初始化为与编号为0的顶点的距离

last[i] = 0;

}

used[0] = 1;

parent[index++] = 0;

for( i=0; i

j = 0;

mini = INFINITY;

for( int k=0; k

if( (0 == used[k]) && (distance[k]

mini = distance[k];

j = k;//j为刚刚找到的V-U中到源点路径最短的顶点

}

used[j] = 1;

for( k=0; k

if( (0 == used[k]) && (distance[k] > distance[j] + g.edg[j][k]) ) { //由于有顶点新加入U集合,对距离数组distance进行更新,比较原路径长度与以新加入的顶点为中间点的路径长度

distance[k] = distance[j] + g.edg[j][k];

}

parent[index++] = j;

}

printf("%c到%c的最短路径经过顶点依次为:\n", g.ver[0], g.ver[VertexNum-1]);

for( i=0; i

printf("%c ", g.ver[parent[i]]);

printf("\n");

printf("最短路径长度为: %d\n", mini);

}

int main()

{

Graph g;

CreateGraph( &g );

PrintGraph( g );

Dijkstra( g );

return 0;

}

测试数据及结果

0818b9ca8b590ca3270a3433284dd417.png



推荐阅读
  • 本文提出了一种基于栈结构的高效四则运算表达式求值方法。该方法能够处理包含加、减、乘、除运算符以及十进制整数和小括号的算术表达式。通过定义和实现栈的基本操作,如入栈、出栈和判空等,算法能够准确地解析并计算输入的表达式,最终输出其计算结果。此方法不仅提高了计算效率,还增强了对复杂表达式的处理能力。 ... [详细]
  • 深入解析C语言中结构体的内存对齐机制及其优化方法
    为了提高CPU访问效率,C语言中的结构体成员在内存中遵循特定的对齐规则。本文详细解析了这些对齐机制,并探讨了如何通过合理的布局和编译器选项来优化结构体的内存使用,从而提升程序性能。 ... [详细]
  • 在尝试对 QQmlPropertyMap 类进行测试驱动开发时,发现其派生类中无法正常调用槽函数或 Q_INVOKABLE 方法。这可能是由于 QQmlPropertyMap 的内部实现机制导致的,需要进一步研究以找到解决方案。 ... [详细]
  • 你的问题在于:1. 代码格式混乱,缺乏必要的缩进,导致可读性极低;2. 使用 `strlen()` 和 `malloc()` 函数时,必须包含相应的头文件;3. `write()` 函数的返回值处理不当,建议检查并处理其返回值以确保程序的健壮性。此外,建议在编写代码时遵循良好的编程规范,增加代码的可维护性和可读性。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在C++程序中,文档A的每一行包含一个结构体数据,其中某些字段可能包含不同数量的数字。需要将这些结构体数据逐行读取并存储到向量中,随后不仅在控制台上显示,还要输出到新创建的文档B中。希望得到指导,感谢! ... [详细]
  • 在C语言中,指针的高级应用及其实例分析具有重要意义。通过使用 `&` 符号可以获取变量的内存地址,而 `*` 符号则用于定义指针变量。例如,`int *p;` 定义了一个指向整型的指针变量 `p`。其中,`p` 代表指针变量本身,而 `*p` 则表示指针所指向的内存地址中的内容。此外,指针在不同函数中可以具有相同的变量名,但其作用域和生命周期会有所不同。指针的灵活运用能够有效提升程序的效率和可维护性。 ... [详细]
  • 在Android平台中,播放音频的采样率通常固定为44.1kHz,而录音的采样率则固定为8kHz。为了确保音频设备的正常工作,底层驱动必须预先设定这些固定的采样率。当上层应用提供的采样率与这些预设值不匹配时,需要通过重采样(resample)技术来调整采样率,以保证音频数据的正确处理和传输。本文将详细探讨FFMpeg在音频处理中的基础理论及重采样技术的应用。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 经过两天的努力,终于成功解决了半平面交模板题POJ3335的问题。原来是在`OnLeft`函数中漏掉了关键的等于号。通过这次训练,不仅加深了对半平面交算法的理解,还提升了调试和代码实现的能力。未来将继续深入研究计算几何的其他核心问题,进一步巩固和拓展相关知识。 ... [详细]
  • 在 Linux 环境下,多线程编程是实现高效并发处理的重要技术。本文通过具体的实战案例,详细分析了多线程编程的关键技术和常见问题。文章首先介绍了多线程的基本概念和创建方法,然后通过实例代码展示了如何使用 pthreads 库进行线程同步和通信。此外,还探讨了多线程程序中的性能优化技巧和调试方法,为开发者提供了宝贵的实践经验。 ... [详细]
  • 在处理大规模数据数组时,优化分页组件对于提高页面加载速度和用户体验至关重要。本文探讨了如何通过高效的分页策略,减少数据渲染的负担,提升应用性能。具体方法包括懒加载、虚拟滚动和数据预取等技术,这些技术能够显著降低内存占用和提升响应速度。通过实际案例分析,展示了这些优化措施的有效性和可行性。 ... [详细]
  • Python 序列图分割与可视化编程入门教程
    本文介绍了如何使用 Python 进行序列图的快速分割与可视化。通过一个实际案例,详细展示了从需求分析到代码实现的全过程。具体包括如何读取序列图数据、应用分割算法以及利用可视化库生成直观的图表,帮助非编程背景的用户也能轻松上手。 ... [详细]
  • 本文详细解析了使用C++实现的键盘输入记录程序的源代码,该程序在Windows应用程序开发中具有很高的实用价值。键盘记录功能不仅在远程控制软件中广泛应用,还为开发者提供了强大的调试和监控工具。通过具体实例,本文深入探讨了C++键盘记录程序的设计与实现,适合需要相关技术的开发者参考。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
author-avatar
firespace
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有