dijkstra的分段断层';s算法 我编写了一个C++程序,用于Dijkstra算法的代码编写。这是代码 #include <iostream> #include <vector> #include <map> using namespace std; class vertex; class node { public: int value; //bool exp=false; char c; }; class edge { public: vertex* head; vertex* tail; int length; edge(vertex*h,vertex* t, int l) { head=h; tail=t; length=l; } }; class vertex:public node { public: vector<edge*> a; vertex& operator|(vertex &p) { int l; cout<<"Give the length of edge "<<this->c<<p.c<<endl; cin>>l; edge q(&p,this,l); a.push_back(&q); } vertex(char a) { c=a; } }; int main() { vertex e('e'); vertex d('d'); vertex b('b'); vertex c('c'); vertex a('a'); vertex s('s'); s.value=1; a.value=2; b.value=3; c.value=4; d.value=5; e.value=6; s|a; s|b; a|c; b|c; b|d; c|d; c|e; d|e; cout<<"4"; map <char ,int >A; vector<edge*>::iterator minin; vector<edge*>::iterator j; int min=0; vector<vertex*> X; X.push_back(&s); A['s']=0; vector<vertex*>::iterator i=X.begin(); for(; i<X.end(); i++) { cout<<"1"; j=((*i)->a).begin(); for(; j<((*i)->a).end(); j++) { cout<<"2"; if((*j)->length+A[((*j)->tail)->c]>min) { cout<<"3"; minin=j; min=(*j)->length+A[((*j)->tail)->c]; } } } X.push_back((*minin)->head); A[((*minin)->tail)->c]=min; cout<<((*minin)->head)->value; } #包括 #包括 #包括 使用名称空间std; 类顶点; 类节点 { 公众: int值; //bool exp=false; 字符c; }; 阶级边缘 { 公众: 顶点*头部; 顶点*尾部; 整数长度; 边(顶点*h,顶点*t,整数l) { 水头=h; 尾=t; 长度=l; } }; 类顶点:公共节点 { 公众: 载体a; 顶点和运算符|(顶点和p) { int l; 不能

dijkstra的分段断层';s算法 我编写了一个C++程序,用于Dijkstra算法的代码编写。这是代码 #include <iostream> #include <vector> #include <map> using namespace std; class vertex; class node { public: int value; //bool exp=false; char c; }; class edge { public: vertex* head; vertex* tail; int length; edge(vertex*h,vertex* t, int l) { head=h; tail=t; length=l; } }; class vertex:public node { public: vector<edge*> a; vertex& operator|(vertex &p) { int l; cout<<"Give the length of edge "<<this->c<<p.c<<endl; cin>>l; edge q(&p,this,l); a.push_back(&q); } vertex(char a) { c=a; } }; int main() { vertex e('e'); vertex d('d'); vertex b('b'); vertex c('c'); vertex a('a'); vertex s('s'); s.value=1; a.value=2; b.value=3; c.value=4; d.value=5; e.value=6; s|a; s|b; a|c; b|c; b|d; c|d; c|e; d|e; cout<<"4"; map <char ,int >A; vector<edge*>::iterator minin; vector<edge*>::iterator j; int min=0; vector<vertex*> X; X.push_back(&s); A['s']=0; vector<vertex*>::iterator i=X.begin(); for(; i<X.end(); i++) { cout<<"1"; j=((*i)->a).begin(); for(; j<((*i)->a).end(); j++) { cout<<"2"; if((*j)->length+A[((*j)->tail)->c]>min) { cout<<"3"; minin=j; min=(*j)->length+A[((*j)->tail)->c]; } } } X.push_back((*minin)->head); A[((*minin)->tail)->c]=min; cout<<((*minin)->head)->value; } #包括 #包括 #包括 使用名称空间std; 类顶点; 类节点 { 公众: int值; //bool exp=false; 字符c; }; 阶级边缘 { 公众: 顶点*头部; 顶点*尾部; 整数长度; 边(顶点*h,顶点*t,整数l) { 水头=h; 尾=t; 长度=l; } }; 类顶点:公共节点 { 公众: 载体a; 顶点和运算符|(顶点和p) { int l; 不能,c++,algorithm,dijkstra,C++,Algorithm,Dijkstra,In 您正在存储一个本地对象的地址,该地址在函数终止后将不再存在。为什么要创建一个类来保留顶点/节点?。我认为您应该使用0到N-1之间的纯整数,以避免使事情变得更复杂。如果顶点由字符串或其他东西标识,您可以使用哈希/映射数据将键转换为整数的结构。这将帮助您避免移动复杂的顶点结构和使用指针 Edge类看起来不错,因为Dijkstra的算法需要所有这些数据才能工作(开始、结束顶点以及路径的权重/成本) 话虽如此,该算法可以使用二进制堆数据结构来实现,以确定边缘选择的优先级。如果不想实现二进制堆,还可

In


您正在存储一个本地对象的地址,该地址在函数终止后将不再存在。

为什么要创建一个类来保留顶点/节点?。我认为您应该使用0到N-1之间的纯整数,以避免使事情变得更复杂。如果顶点由字符串或其他东西标识,您可以使用哈希/映射数据将键转换为整数的结构。这将帮助您避免移动复杂的顶点结构和使用指针

Edge类看起来不错,因为Dijkstra的算法需要所有这些数据才能工作(开始、结束顶点以及路径的权重/成本)

话虽如此,该算法可以使用二进制堆数据结构来实现,以确定边缘选择的优先级。如果不想实现二进制堆,还可以使用优先级队列()


最后,我将使用边向量迭代每个顶点的相邻顶点。

在发布之前,您应该养成尽可能减少代码的习惯,因为这有助于发现错误。另请参阅发布指南。
a.push_back(&q);