#include "Dijkstra.h"
#include <string>
using namespace std;
/*
* (1)二维数组存储输入的边的权重数据,数组的下标表示指向。
* (2)存储输出结果的对象指针。
* (3)输入数据的顶点数和边上权重的两个变量。
*/
Dijkstra::Dijkstra(int Num1, int Num2)
{
vertexNum = Num1;
sideNum = Num2;
/* 变量内存的申请 */
//二维指针数组的堆上内存的申请
sideDataMatrix = new int*[vertexNum];
for (int i = 0; i < vertexNum; i++)
{
sideDataMatrix[i] = new int[vertexNum];
}
for (int i = 0; i < vertexNum; i++)
{
for (int j = 0; j < vertexNum; j++)
{
sideDataMatrix[i][j] = INT_MAX;
}
}
dijkstraDataArray = new DijkstraData[vertexNum];
}
Dijkstra::Dijkstra()
{
}
Dijkstra::~Dijkstra()
{
/* 申请内存变量控件的清理 */
for (int i = 0; i < vertexNum; i++)
{
delete[] sideDataMatrix[i];
}
delete[] dijkstraDataArray;
}
/*
* (1)输入顶点数和边权重的存储函数
* (2)边权重数的存储函数
* (3)权重存储的数组的打印
* (4)Dijkstra算法的实现
* (5)最短路径的打印函数
*/
void Dijkstra::setDijkstraData(int Num1, int Num2)
{
vertexNum = Num1;
sideNum = Num2;
/* 变量内存的申请 */
//二维指针数组的堆上内存的申请
sideDataMatrix = new int* [vertexNum];
for (int i = 0; i < vertexNum; i++)
{
sideDataMatrix[i] = new int[vertexNum];
}
for (int i = 0; i < vertexNum; i++)
{
for (int j = 0; j < vertexNum; j++)
{
sideDataMatrix[i][j] = INT_MAX;
}
}
dijkstraDataArray = new DijkstraData[vertexNum];
}
void Dijkstra::saveSideByVertex(int start, int end, int sidedata)
{
if ((start > 0) && (start <= sideNum) && (end > 0) && (end <= sideNum) && (sidedata > 0))
{
sideDataMatrix[start-1][end-1] = sidedata;
//cout << start << "," << end << "," << sidedata <<"," << sideDataMatrix[start][end] << endl;
}
else
{
cout << "输入数据错误" << endl;
}
}
void Dijkstra::printSideDataMatrix()
{
cout << "节点数据的结构体:" << endl;
for (int i = 0; i < vertexNum; i++)
{
for (int j = 0; j < vertexNum; j++)
{
if (sideDataMatrix[i][j] == INT_MAX)
cout << "∞";
else
cout << sideDataMatrix[i][j];
cout << " ";
}
cout << endl;
}
cout << endl;
}
/* Dijkstra算法的主要函数,begin设置起始点 */
void Dijkstra::DijkstraFunction(int begin)
{
int count = 0;
/* 设置字符串中的路径,以及初始点的周围指向权重 */
for (int i = 0; i < vertexNum; i++)
{
dijkstraDataArray[i].path = "v" + to_string(begin) + "-->v" + to_string(i+1);
dijkstraDataArray[i].sideDataMin = sideDataMatrix[begin-1][i];
}
/* 设置起点路径,设置指向自己的权重为0 */
dijkstraDataArray[begin - 1].isMin = true;
dijkstraDataArray[begin - 1].sideDataMin = 0;
/* 最短路径的计算 */
while (count != vertexNum)
{
int temp = 0;
int min = INT_MAX;
/* 找出来dijkstraDataArray数组中的总权重最小值 */
for (int i = 0; i < vertexNum; i++)
{
if ((!dijkstraDataArray[i].isMin) && (dijkstraDataArray[i].sideDataMin < min))
{
min = dijkstraDataArray[i].sideDataMin;
temp = i;
}
}
dijkstraDataArray[temp].isMin = true;
count++;
/* 分析临近节点权重最小的线路,更新到对应的权重 */
for (int i = 0; i < vertexNum; i++)
{
if ((sideDataMatrix[temp][i] != INT_MAX) && \
(!dijkstraDataArray[i].isMin) && \
((sideDataMatrix[temp][i] + dijkstraDataArray[temp].sideDataMin) < dijkstraDataArray[i].sideDataMin))
{
cout << dijkstraDataArray[i].sideDataMin << endl;
dijkstraDataArray[i].sideDataMin = dijkstraDataArray[temp].sideDataMin + sideDataMatrix[temp][i];
dijkstraDataArray[i].path = dijkstraDataArray[temp].path+ "-->v" + to_string(i+1);
}
}
}
}
void Dijkstra::printMinPath()
{
cout << "搜索到的V1到Vi的最短路径" << endl;
for (int i = 0; i < vertexNum; i++)
{
if (dijkstraDataArray[i].isMin && (dijkstraDataArray[i].sideDataMin != INT_MAX))
{
cout << dijkstraDataArray[i].path << "=" << dijkstraDataArray[i].sideDataMin << endl;
}
else
{
cout << dijkstraDataArray[i].path << " " << "没有路径" << endl;
}
}
}
没有合适的资源?快使用搜索试试~ 我知道了~
Dijkstra算法的项目code
共3个文件
cpp:2个
h:1个
0 下载量 82 浏览量
2023-08-20
14:54:16
上传
评论
收藏 3KB RAR 举报
温馨提示
Dijkstra算法的项目code
资源推荐
资源详情
资源评论
收起资源包目录
Dijkstra.rar (3个子文件)
Dijkstra
Dijkstra.h 1KB
main.cpp 1KB
Dijkstra.cpp 4KB
共 3 条
- 1
资源评论
一天不学习,就给自己一个大b兜子
- 粉丝: 88
- 资源: 3
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功