用C语言编程最短路径,用最笨的方法,实现的最短路径算法(C语言)

使用最笨的方法实现,递归遍历的方式,有待持续的优化。附件中有原始代码和测试用例。#include "commondef.h"

#include "depthsearch.h"

#ifdef __cplusplus

extern "C"

{

#endif

void SearchDestNode

(

const MapEdge *pstEdgeList,

UINT32 ulEdgeCnt,

NodeName *pstNodeList,

UINT32 ulDepth,

NodeDistance preDistance,

const NodeName *pNodeTo,

NodeDistance *pMinDistance

)

{

UINT32 ulLoop;

const MapEdge *pstEdge;

NodeName *pTempNodeName;

UINT32 isFromAdd;

UINT32 isToAdd;

/* 如果上一层处理的最后节点,是结束节点,立即返回 */

if (pstNodeList[ulDepth - 1] == *pNodeTo)

{

if (preDistance < *pMinDistance)

{

*pMinDistance = preDistance;

}

return;

}

for (ulLoop = 0; ulLoop < ulEdgeCnt; ulLoop++)

{

pstEdge = pstEdgeList + ulLoop;

/* 已经结束,立即返回 */

if ((pstEdge->nodeFrom == *pNodeTo && pstNodeList[ulDepth - 1] == pstEdge->nodeTo)

|| (pstEdge->nodeTo == *pNodeTo && pstNodeList[ulDepth - 1] == pstEdge->nodeFrom))

{

if (preDistance + pstEdge->nodeDistance < *pMinDistance)

{

*pMinDistance = preDistance + pstEdge->nodeDistance;

}

return;

}

/* 当前节点起始位置都在路径中存在,跳过此节点 */

pTempNodeName = pstNodeList;

isFromAdd = BOOL_FALSE;

isToAdd = BOOL_FALSE;

while (pTempNodeName < pstNodeList + ulDepth)

{

if (*pTempNodeName == pstEdge->nodeFrom)

{

isFromAdd = BOOL_TRUE;

}

if (*pTempNodeName == pstEdge->nodeTo)

{

isToAdd = BOOL_TRUE;

}

pTempNodeName++;

}

/* 当衔接上一层节点,并且下一个节点不在链表中,继续拼接 */

if (isFromAdd ^ isToAdd)

{

if (pstNodeList[ulDepth - 1] == pstEdge->nodeFrom && !isToAdd)

{

pstNodeList[ulDepth] = pstEdge->nodeTo;

SearchDestNode(pstEdgeList, ulEdgeCnt, pstNodeList,

ulDepth + 1, preDistance + pstEdge->nodeDistance, pNodeTo, pMinDistance);

}

else if (pstNodeList[ulDepth - 1] == pstEdge->nodeTo && !isFromAdd)

{

pstNodeList[ulDepth] = pstEdge->nodeFrom;

SearchDestNode(pstEdgeList, ulEdgeCnt, pstNodeList, ulDepth + 1,

preDistance + pstEdge->nodeDistance, pNodeTo, pMinDistance);

}

}

}

}

NodeDistance ApiCalMinDistance

(

const MapEdge *pstEdgeList,

UINT32 ulEdgeCnt,

const NodeName *pNodeFrom,

const NodeName *pNodeTo,

const SysCallBackFun *pstCallback

)

{

NodeName *ptNodeList;

NodeDistance minDistance = MAX_DISTANCE;

UINT32 ulLoop;

ptNodeList = (NodeName *)pstCallback->pfMemAlloc(sizeof(NodeName) * ( 2 * ulEdgeCnt - 1));

if (ptNodeList == NULL_PTR)

{

return minDistance;

}

if (*pNodeFrom == *pNodeTo)

{

for (ulLoop = 0; ulLoop < ulEdgeCnt; ulLoop++)

{

if ((pstEdgeList[ulLoop].nodeFrom == *pNodeFrom)

|| (pstEdgeList[ulLoop].nodeTo == *pNodeFrom))

{

return MIN_DISTANCE;

}

}

}

else

{

for (ulLoop = 0; ulLoop < ulEdgeCnt; ulLoop++)

{

if (pstEdgeList[ulLoop].nodeFrom == *pNodeFrom)

{

ptNodeList[0] = *pNodeFrom;

ptNodeList[1] = pstEdgeList[ulLoop].nodeTo;

SearchDestNode(pstEdgeList, ulEdgeCnt, ptNodeList, 2, pstEdgeList[ulLoop].nodeDistance, pNodeTo, &minDistance);

}

else if (pstEdgeList[ulLoop].nodeTo == *pNodeFrom)

{

ptNodeList[0] = *pNodeFrom;

ptNodeList[1] = pstEdgeList[ulLoop].nodeFrom;

SearchDestNode(pstEdgeList, ulEdgeCnt, ptNodeList, 2, pstEdgeList[ulLoop].nodeDistance, pNodeTo, &minDistance);

}

}

}

pstCallback->pfMemFree(ptNodeList);

return minDistance;

}

#ifdef __cplusplus

}

#endif

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是C语言的单源最短路径算法(Dijkstra算法)代码,包含每行注释: ```c #include <stdio.h> #include <limits.h> // 包含定义了整型数的限制的头文件 #define V 5 // 定义顶点数为5 // 找到dist[]数组中最小值的下标 int minDistance(int dist[], bool sptSet[]) { int min = INT_MAX, min_index; // 初始化最小值为整型数的最大值 for (int v = 0; v < V; v++) if (sptSet[v] == false && dist[v] <= min) min = dist[v], min_index = v; // 更新最小值和最小值对应的下标 return min_index; } // 打印dist[]数组 void printSolution(int dist[]) { printf("Vertex \t Distance from Source\n"); for (int i = 0; i < V; i++) printf("%d \t\t %d\n", i, dist[i]); } void dijkstra(int graph[V][V], int src) { int dist[V]; // 存储从源点到各个顶点的最短距离 bool sptSet[V]; // 判断顶点是否已经在最短路径树中 // 初始化所有距离为最大值,所有顶点都不在最短路径树中 for (int i = 0; i < V; i++) dist[i] = INT_MAX, sptSet[i] = false; dist[src] = 0; // 源点距离为0 // 找到最短路径树中的V-1个顶点 for (int count = 0; count < V - 1; count++) { int u = minDistance(dist, sptSet); // 从未包含的顶点中找到最小距离的顶点 sptSet[u] = true; // 标记该顶点已经在最短路径树中 // 更新所有与该顶点相邻的顶点的最短距离 for (int v = 0; v < V; v++) if (!sptSet[v] && graph[u][v] && dist[u] != INT_MAX && dist[u] + graph[u][v] < dist[v]) dist[v] = dist[u] + graph[u][v]; } printSolution(dist); // 打印dist[]数组 } int main() { int graph[V][V] = { { 0, 4, 0, 0, 8 }, { 4, 0, 8, 0, 7 }, { 0, 8, 0, 7, 0 }, { 0, 0, 7, 0, 9 }, { 8, 7, 0, 9, 0 } }; // 图的邻接矩阵 dijkstra(graph, 0); // 从源点0开始计算最短路径 return 0; } ``` 以上代码实现了从图中的源点0开始,计算出到每个顶点的最短路径,并输出结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值