本帖最后由 highflybird 于 2024-9-13 08:38 编辑
弄了一个 寻找最短路径-dijkstra算法之CAD版。
这个是dijkstra算法在AutoCAD上的应用。可以看出dijkstra算法效率很高。本程序采用ObjectARX编译,速度很快,代码比较简短。有探讨的朋友可联系我。
下面是演示效果:
这里提供arx程序,按CAD相应版本加载即可,命令是:DDD
(程序不再设置时间限制,也不再收取明经币,以前收取的,望见谅!)
其中核心代码是:
- void CGraph::dijkstra(CNode& startNode)
- {
- for (std::set<CNode>::iterator n = allNodes.begin(); n !=allNodes.end (); ++n)
- {
- (bool)n->bVisted = false; // true表示到结点i的最短路径已经找到
- (double)n->dist = DBL_MAX; // 记录所有结点到起点的距离
- }
- pre.resize(allNodes.size());
- startNode.dist = 0; // 起点到自己的距离为0
- // 优先队列,存结点信息
- priority_queue<pair<double, CNode*>, vector<pair<double, CNode*>>, greater<pair<double, CNode*>>> Q;
- Q.push(make_pair(0,&startNode));// 起点入队
- while(!Q.empty())
- {
- CNode* u = Q.top().second; // pop出距离起点s最小的节点u
- Q.pop();
- if (u->bVisted) continue; // 丢弃已经找到最短路径的结点,即集合A中的结点
- u->bVisted = true;
- for (std::set<CEdge>::iterator e = u->edges.begin(); e != u->edges.end(); ++e)// 检查结点u的所有邻居
- {
- CNode* v = e->pNext->isEqualTo(*u,actol) ? (e->pNode) : ( e->pNext); // 邻居对应的节点
- if (v->bVisted) continue;// 丢弃已经找到最短路径的邻居结点
- double d = e->length+u->dist;
- if (v->dist > d)
- {
- v->dist = d;
- Q.push(make_pair(d,v));// 扩展新的邻居,放到优先队列中
- pre[v->index].index = u->index ; // 记录节点
- pre[v->index].edge = *e; // 记录路径
- }
- }
- }
- }
代码参考了:https://zhuanlan.zhihu.com/p/615138731
|