邻接表的c++实现 及 Dijkstra算法
来源:互联网 发布:vscode移除文件夹 编辑:程序博客网 时间:2024/06/18 05:04
邻接表的c++
#define maxSize 5#define INFINITY 10000 //代表无穷typedef char Vertex;//节点类型typedef int edge;//边上权值类型 //边节点class edgeNode{public:edgeNode();~edgeNode();int adjvex;edge weight;edgeNode *next;private:};edgeNode::edgeNode(){adjvex = -1;weight = -1;next = NULL;}edgeNode::~edgeNode(){}//顶点节点class vertexNode{public:vertexNode();~vertexNode();int subscript;//下标 Vertex data;edgeNode *firstEdge;private:};vertexNode::vertexNode(){data = '0';firstEdge = NULL;}vertexNode::~vertexNode(){}class graphList{public:graphList(int numVertxnode, int numEdgenode);~graphList();void addEdge(int v1, int v2, int weight);//添加节点void display();void Dijkstra(int choose);void Dijkstra_2();vertexNode vertxnode[maxSize];//头节点顺序表int numVertxnode, numEdgenode;//节点数目、边数private:};graphList::graphList(int numVertxnode, int numEdgenode){this->numEdgenode = numEdgenode;this->numVertxnode = numVertxnode;}graphList::~graphList(){}void graphList::addEdge(int v1, int v2, int weight){edgeNode *temp;temp = new edgeNode();temp->weight = weight;temp->adjvex = v2;temp->next = vertxnode[v1].firstEdge;vertxnode[v1].firstEdge = temp;temp = new edgeNode();//无向图的反向添加temp->weight = weight;temp->adjvex = v1;temp->next = vertxnode[v2].firstEdge;vertxnode[v2].firstEdge = temp;}void graphList::display(){edgeNode *p;p = new edgeNode();for (int i = 0; i < numVertxnode; i++){p = vertxnode[i].firstEdge;cout << vertxnode[i].data << ": ";while (p){cout << p->adjvex << " " << p->weight << " -> ";p = p->next;}cout << endl;}}
Dijkstra算法
void graphList::Dijkstra(int choose){vertexNode v, v2;edgeNode *temp;char p, q = 0;switch (choose)//1为单源到所有节点,2为两个节点之间的最短距离{case 0:exit(1);case 1:cout << "请输入查询节点名称: " << endl;cin >> p; break;case 2:cout << "请输入查询起点名称: " << endl;cin >> p;cout << "请输入查询终点名称: " << endl;cin >> q;}int min, Final[maxSize], k, *a;//final用来存储到各节点的最短距离;*a作为返回值int kn[maxSize];//kn是否找到最短路径for (int i = 0; i < numVertxnode; i++)//{if (vertxnode[i].data == q){v2 = vertxnode[i];}if (vertxnode[i].data == p){v = vertxnode[i];temp = v.firstEdge;Final[i] = 0;kn[i] = 1;}else {Final[i] = INFINITY;kn[i] = 0;}}if (v.data == '0' || (v2.data == '0'&&choose == 2)){cout << "输入点有误!" << endl;return;}else{while (temp){Final[temp->adjvex] = temp->weight;temp = temp->next;}}min = INFINITY;for (int i = 0; i < numVertxnode; i++)//主循环{while (temp){if (kn[temp->adjvex] == 0 && temp->weight + min < Final[temp->adjvex]){Final[temp->adjvex] = temp->weight + min;}temp = temp->next;}min = INFINITY;for (int j = 0; j < numVertxnode; j++)//查找到v最近的点{if (min > Final[j] && Final[j] != 0 && kn[j] == 0){min = Final[j];k = j;//记录min对于节点序号}}kn[k] = 1;//找到最近节点 temp = vertxnode[k].firstEdge;}
switch (choose) { case 1:for (int i = 0; i < 5; i++) { if (vertxnode[i].data != v.data) { cout << v.data << "到" << vertxnode[i].data << "的最短距离为 " << Final[i] << endl; } } cout << endl; break; case 2:cout << p << "到" << q << "的最短距离为 " << Final[v2.subscript] << endl; cout << endl; }
阅读全文
0 0
- 邻接表的c++实现 及 Dijkstra算法
- C++Dijkstra邻接表实现
- 基于邻接表和优先级队列的Dijkstra算法实现
- dijkstra算法(C语言 邻接表)
- 图论--Dijkstra算法----邻接表实现
- Dijkstra算法 求单源含权最短路径(邻接表有向图)C实现
- Dijkstra算法实现类—提高,邻接表+优先队列
- 算法-dijkstra求最短路径(邻接表实现)
- 使用优先队列+邻接表的Dijkstra算法
- 堆优化的dijkstra算法(以邻接表存储)
- 最短路径的Dijkstra算法(邻接表)
- 邻接表实现PRIM算法(C++)
- Dijkstra的实现(用vector模拟邻接链表)
- Dijkstra算法2:邻接表描述
- 最短路径(邻接表)-Dijkstra算法
- Dijkstra算法--邻接表存储+堆优化
- C++Dijkstra算法实现
- Dijkstra算法的实现及原理
- 趣图:在我电脑好好的啊!
- 主要性能指标剖析图表
- 今日头条前端面经
- Javscript高级程序设计之-Chapter3总结
- JDK1.6安装(完结)
- 邻接表的c++实现 及 Dijkstra算法
- 父母对你工作的看法竟然是......(图集)
- 映射与元祖
- 【Scala】泛函数
- ajax验证
- Netty 5用户指南
- 周四见|《 MySQL自动化扩容实践》by吴炳锡
- 灯光的学习
- 个人整理的代码片段