c语言简易邻接表实现建立有向图及无向图上的dijstra最短路算法(记录路径)(不弱智版)

本文主要是介绍c语言简易邻接表实现建立有向图及无向图上的dijstra最短路算法(记录路径)(不弱智版),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

课本里讲的真的弱智,描述一个图好几个结构体嵌套到一块,真的头疼,正好考研的同学问到我相关的大题,就稍微写一下,代码很简单,不怎么需要注释应该能看懂

文件1是邻接表建有向图(无权)
文件2是邻接表实现dijstra算法(无权)(有注释)

#include<stdio.h>
#include<malloc.h>typedef struct node
{int id;int weight;struct node *next;
}gnode, *gnodeptr;create(gnodeptr* p)
{(*p) = (gnodeptr)malloc(sizeof(gnode));
}int main()
{gnode g[100];int n,m,i,j;scanf("%d%d", &n, &m);for(i=0;i<n;i++){int k;scanf("%d", &k);g[k].id = k;g[k].weight = -1;g[k].next = NULL;}for(i=0;i<m;i++){int k,l;scanf("%d%d", &k, &l);gnodeptr temp;create(&temp);temp->id = l;temp->weight = 1;temp->next = NULL;temp->next = g[k].next;g[k].next = temp;}for(i=0;i<n;i++){gnode temp = g[i];while(1){printf("%d-> ", temp.id);if(temp.next == NULL)  break;temp = *(temp.next);}printf("\n");}
}/*
2 2
0 1
0 1
1 0
*/

#include<stdio.h>
#include<malloc.h>typedef struct node
{int id;int weight;struct node *next;
}gnode, *gnodeptr;create(gnodeptr* p)
{(*p) = (gnodeptr)malloc(sizeof(gnode));
}int dijstra(gnode g[], int n, int m, int start, int end)
{int visited[100], loop,i;int distance[100];int path[100];for(i=0;i<n;i++){visited[i] = 0;distance[i] = 99999;path[i] = -1;}distance[start] = 0;gnodeptr temp = &(g[start]);for(loop=0;loop<n;loop++){int min_index, min_index_dis = 99999;for(i=0;i<n;i++){if(distance[i] < min_index_dis && visited[i] == 0){min_index = i;min_index_dis = distance[i];}}if(min_index == end){int p = end;while(1){printf("%d<-", p);p = path[p];if(p == start){printf("%d\n", p);break;}}return min_index_dis;}visited[min_index] = 1;gnodeptr temp = (&(g[min_index]))->next;for(;temp != NULL;temp = temp->next){if(visited[temp->id]==0 && distance[temp->id] > min_index_dis + 1){distance[temp->id] = min_index_dis + 1;// 记录路径,被更新点的前驱path[temp->id] = min_index;}}/*for(;temp != NULL;temp = temp->next){if(visited[temp->id]==0 && distance[temp->id] > distance[min_index] + temp.weight){distance[temp->id] = distance[min_index] + temp.weight;}}*/}
}int main()
{gnode g[100];int n,m,i,j;scanf("%d%d", &n, &m);for(i=0;i<n;i++){int k;scanf("%d", &k);g[k].id = k;g[k].weight = -1;g[k].next = NULL;}// 建图for(i=0;i<m;i++){// 建第一条边int k,l;scanf("%d%d", &k, &l);gnodeptr temp, temp2;create(&temp);temp->id = l;temp->weight = 1;temp->next = NULL;temp->next = g[k].next;g[k].next = temp;// 第二个反向边create(&temp2);temp2->id = k;temp2->weight = 1;temp2->next = NULL;temp2->next = g[l].next;g[l].next = temp2;}// 图的邻接表的可视化for(i=0;i<n;i++){gnode temp = g[i];while(1){printf("%d-> ", temp.id);if(temp.next == NULL)  break;temp = *(temp.next);}printf("\n");}int start, end;while(1){scanf("%d%d", &start, &end);int ans = dijstra(g, n, m, start, end);printf("min distance equal %d\n", ans);}
}/*
4 4
0 1 2 3
0 1
0 2
1 2
2 34 6
0 1 2 3
0 1
0 2
0 3
1 2
2 3
3 14 3
0 1 2 3
0 3
3 2
1 26 5
0 1 2 3 4 5
0 3
3 2
2 1
2 4
4 57 9
0 1 2 3 4 5 6
0 3
0 5
3 2
2 1
2 6
1 4
2 5
4 5
4 6
*/

这篇关于c语言简易邻接表实现建立有向图及无向图上的dijstra最短路算法(记录路径)(不弱智版)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/758488

相关文章

Redis客户端连接机制的实现方案

《Redis客户端连接机制的实现方案》本文主要介绍了Redis客户端连接机制的实现方案,包括事件驱动模型、非阻塞I/O处理、连接池应用及配置优化,具有一定的参考价值,感兴趣的可以了解一下... 目录1. Redis连接模型概述2. 连接建立过程详解2.1 连php接初始化流程2.2 关键配置参数3. 最大连

Python实现网格交易策略的过程

《Python实现网格交易策略的过程》本文讲解Python网格交易策略,利用ccxt获取加密货币数据及backtrader回测,通过设定网格节点,低买高卖获利,适合震荡行情,下面跟我一起看看我们的第一... 网格交易是一种经典的量化交易策略,其核心思想是在价格上下预设多个“网格”,当价格触发特定网格时执行买

java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)

《java中pdf模版填充表单踩坑实战记录(itextPdf、openPdf、pdfbox)》:本文主要介绍java中pdf模版填充表单踩坑的相关资料,OpenPDF、iText、PDFBox是三... 目录准备Pdf模版方法1:itextpdf7填充表单(1)加入依赖(2)代码(3)遇到的问题方法2:pd

python设置环境变量路径实现过程

《python设置环境变量路径实现过程》本文介绍设置Python路径的多种方法:临时设置(Windows用`set`,Linux/macOS用`export`)、永久设置(系统属性或shell配置文件... 目录设置python路径的方法临时设置环境变量(适用于当前会话)永久设置环境变量(Windows系统

Python对接支付宝支付之使用AliPay实现的详细操作指南

《Python对接支付宝支付之使用AliPay实现的详细操作指南》支付宝没有提供PythonSDK,但是强大的github就有提供python-alipay-sdk,封装里很多复杂操作,使用这个我们就... 目录一、引言二、准备工作2.1 支付宝开放平台入驻与应用创建2.2 密钥生成与配置2.3 安装ali

Spring Security 单点登录与自动登录机制的实现原理

《SpringSecurity单点登录与自动登录机制的实现原理》本文探讨SpringSecurity实现单点登录(SSO)与自动登录机制,涵盖JWT跨系统认证、RememberMe持久化Token... 目录一、核心概念解析1.1 单点登录(SSO)1.2 自动登录(Remember Me)二、代码分析三、

PyCharm中配置PyQt的实现步骤

《PyCharm中配置PyQt的实现步骤》PyCharm是JetBrains推出的一款强大的PythonIDE,结合PyQt可以进行pythion高效开发桌面GUI应用程序,本文就来介绍一下PyCha... 目录1. 安装China编程PyQt1.PyQt 核心组件2. 基础 PyQt 应用程序结构3. 使用 Q

C语言进阶(预处理命令详解)

《C语言进阶(预处理命令详解)》文章讲解了宏定义规范、头文件包含方式及条件编译应用,强调带参宏需加括号避免计算错误,头文件应声明函数原型以便主函数调用,条件编译通过宏定义控制代码编译,适用于测试与模块... 目录1.宏定义1.1不带参宏1.2带参宏2.头文件的包含2.1头文件中的内容2.2工程结构3.条件编

Python实现批量提取BLF文件时间戳

《Python实现批量提取BLF文件时间戳》BLF(BinaryLoggingFormat)作为Vector公司推出的CAN总线数据记录格式,被广泛用于存储车辆通信数据,本文将使用Python轻松提取... 目录一、为什么需要批量处理 BLF 文件二、核心代码解析:从文件遍历到数据导出1. 环境准备与依赖库

linux下shell脚本启动jar包实现过程

《linux下shell脚本启动jar包实现过程》确保APP_NAME和LOG_FILE位于目录内,首次启动前需手动创建log文件夹,否则报错,此为个人经验,供参考,欢迎支持脚本之家... 目录linux下shell脚本启动jar包样例1样例2总结linux下shell脚本启动jar包样例1#!/bin