主题:
最短路径问题 Dijkstra算法的实现
正文
源文件(使用Vs2019):链接:https://pan.baidu.com/s/1nVw2TcYAlMEPJQMi4D3GvQ
提取码:fa5a
本项目建立了三个文件:
1、function.h
#include<iostream>
using namespace std;
struct Adj {
int VerAdj;//结点编号
int cost;//权值
Adj* link;//下一个边链表结点指针
};
struct Head {
int VerAdj;//结点编号
Adj* adjacent;//边表头指针
};
//(顶点表,顶点个数,起始顶点,路径长度,前一个顶点 )
void DShortestPath(Head Head[],int n,int v,int dist[],int path[] );
2、function.cpp
#include"function.h"
#define MAX 65535
//计算v到其他各顶点的最短路径。n表示顶点个数,v表示起始顶点,head为顶点表,dist[i]为v到i的最短路径长度,path[i]表示v到i路径上i的前驱结点
void DShortestPath(Head head[], int n, int v, int dist[], int path[])
{
int* s=new int[n];//用于记录顶点是否被访问过
Adj* p;
int u;
//初始化
for (int i = 0; i < n; i++) {
path[i] = -1;
dist[i] = MAX;
s[i] = 0;
}
dist[v] = 0;
s[v] = -1;//s[i]为-1表示访问过
p = head[v].adjacent;
u = v;//u是即将被访问的顶点
//求从初始顶点v到其他顶点的最短路径
for (int j = 1; j < n; j++) {
while (p!= nullptr) {//修改u邻接顶点的s[]值、path[]值、和dist[]值
int k = p->VerAdj;
if (s[k] != -1 && dist[u] + p->cost < dist[k]) {
dist[k] = dist[u] + p->cost;
path[k] = u;
}
p = p->link;
}
//寻找下一个u
int ldist = MAX;
for (int i = 0; i < n; i++) {
if (dist[i] < ldist && s[i] == 0) {
ldist = dist[i];
u = i;
}
}
s[u] = -1;//访问u
p = head[u].adjacent;//p为u边链表的头指针
}
delete[] s;
//输出最短路径及其长度
for (int i = 0; i < n; i++) {
int j = head[i].VerAdj;
if (j != v) {
cout << j << "--";
while (path[j] != v) {//输出到v
cout << path[j]<<"--";
j = path[j];
}
cout << v << endl << "path cost:" << dist[head[i].VerAdj]<<endl;
}
}
}
3、main.cpp
#include"function.h"
void main() {
//按照吉大计算机教材数据结构(第三版)165页图6.5(a)建立邻接表
Head* head = new Head[5];
Adj* ad = new Adj[6];
//初始化六个边结点
ad[0].VerAdj = 1;
ad[0].cost = 2;
ad[0].link = &ad[1];
ad[1].VerAdj = 2;
ad[1].cost = 7;
ad[1].link = &ad[2];
ad[2].VerAdj = 4;
ad[2].cost = 1;
ad[2].link = NULL;
ad[3].VerAdj = 3;
ad[3].cost = 5;
ad[3].link = NULL;
ad[4].VerAdj = 0;
ad[4].cost = 3;
ad[4].link = &ad[5];
ad[5].VerAdj = 3;
ad[5].cost = 4;
ad[5].link = NULL;
//初始化顶点表
for (int i = 0; i < 5; i++) {
head[i].VerAdj = i;
}
head[0].adjacent = &ad[0];
head[1].adjacent = NULL;
head[2].adjacent = &ad[3];
head[3].adjacent = NULL;
head[4].adjacent = &ad[4];
int* dist = new int[5];
int* path = new int[5];
//调用迪杰斯特拉算法(输出的是每个顶点到顶点v的路径以及路径长度)
DShortestPath(head, 5, 0, dist, path);
delete[] head;
delete[] dist;
delete[] path;
delete[] ad;
}