邻接表的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; }