天气与日历 切换到窄版

 找回密码
 立即注册
中国膜结构网
十大进口膜材评选 十大国产膜材评选 十大膜结构设计评选 十大膜结构公司评选
查看: 127|回复: 0

寻找最短路径-dijkstra算法之CAD版

[复制链接]

该用户从未签到

主题

0

回帖

2912

积分

管理员

积分
2912
发表于 2024-5-21 21:08:55 | 显示全部楼层 |阅读模式
弄了一个 寻找最短路径-dijkstra算法之CAD版。

这个是dijkstra算法在AutoCAD上的应用。可以看出dijkstra算法效率很高。本程序采用ObjectARX编译,速度很快,代码比较简短。有探讨的朋友可联系我。

其中核心代码是
  1. void CGraph::dijkstra(CNode& startNode)
  2. {
  3.   for (std::set<CNode>::iterator n = allNodes.begin(); n !=allNodes.end (); ++n)
  4.   {
  5.     (bool)n->bVisted = false;  // true表示到结点i的最短路径已经找到
  6.     (double)n->dist = DBL采用MAX;  // 记录所有结点到起点的距离
  7.   }
  8.   pre.resize(allNodes.size());
  9.   startNode.dist = 0;        // 起点到自己的距离为0
  10.   // 优先队列,存结点信息
  11.   priority采用queue<pair<double, CNode*>, vector<pair<double, CNode*>>, greater<pair<double, CNode*>>> Q;
  12.   Q.push(make采用pair(0,&startNode));// 起点入队
  13.   while(!Q.empty())
  14.   {
  15.     CNode* u = Q.top().second;  // pop出距离起点s最小的节点u
  16.     Q.pop();
  17.     if (u->bVisted) continue;  // 丢弃已经找到最短路径的结点,即集合A中的结点
  18.     u->bVisted = true;
  19.     for (std::set<CEdge>::iterator e = u->edges.begin(); e != u->edges.end(); ++e)// 检查结点u的所有邻居
  20.     {
  21.       CNode* v = e->pNext->isEqualTo(*u,actol) ? (e->pNode) : ( e->pNext); // 邻居对应的节点
  22.       if (v->bVisted) continue;// 丢弃已经找到最短路径的邻居结点  
  23.       double d = e->length+u->dist;
  24.       if (v->dist > d)
  25.       {
  26.         v->dist = d;
  27.         Q.push(make采用pair(d,v));// 扩展新的邻居,放到优先队列中
  28.         pre[v->index].index = u->index ; // 记录节点
  29.         pre[v->index].edge = *e;         // 记录路径
  30.       }
  31.     }
  32.   }
  33. }
  34. 代码参考了:https://zhuanlan.zhihu.com/p/615138731
复制代码

 

 

 

 

寻找最短路径-dijkstra算法之CAD版
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|中国膜结构网|中国膜结构协会|进口膜材|国产膜材|ETFE|PVDF|PTFE|设计|施工|安装|车棚|看台|污水池|中国膜结构网_中国空间膜结构协会

GMT+8, 2024-11-5 12:28 , Processed in 0.134389 second(s), 24 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表