最短路径问题 Dijkstra算法的实现

主题:

最短路径问题 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;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值