最短路径分析-Dijkstra算法

算法说明:

(1)用带权的邻接矩阵Cost来表示带权的n个节点的有向图,Cost[i,j]表示弧 的权值,如果从vi到vj不连通,则Cost[i,j]=∞;若连通则权值为两个节点的距离。引进一个辅助向量Dist,每个分量Dist[i]表示从起始点到每个终点vi的 最短路径长度。假定起始点在有向图中的序号为i0,并设定该向量的初 始值为: Dist[i]=Cost[i0,i] vi∈V。令S为已经找到的从起点出发的最短路径的终点的集合。

(2)选择Vj,使得 Dist[j]=Min{ Dist[i]|Vi∈V-S} vi∈V vj就是当前求得的一条从vi0出发的最短路径的终点,令 S=S∪{vj}。

(3)修改从vi0出发到集合V-S中任意一顶点vk的最短路径长度。 如果 Dist[j]+Cost[j,k]则修改Dist[k]为: Dist[k]=Dist[j]+Cost[j,k]。

(4)重复第2、3步操作共n-1次,由此求得从vi0出发的到图上各 个顶点的最短路径是依路径长度递增的序列。


实例:

 


程序说明:

1:定义无穷大inf:

	double a = 1;
	double inf = a / 0;//定义无穷大

2:函数Dijkstra用来计算:以0号点为起点计算到其它点的最短距离输入参数有二个:一个为邻接矩阵,另外一个为所求的点号;

double Dijkstra(double m[6][6],int n)//计算以V0为起点到其他顶点的最短距离
//m为邻接矩阵
//n为终点的点号 即从V0到VN的点号

结果:

 


PS:

if (S[1] == n || S[2] == n || S[3] == n || S[4] == n || S[5] == n)
			break;//若不加此判断条件,循环结束DIST中即为点0到其余各点的最短距离

函数中删去此判断条件,循环结束DIST中即为点0到其余各点的最短距离。


代码:

#include<iostream>
using namespace std;
double Dijkstra(double m[6][6],int n)//计算以V0为起点到其他顶点的最短距离
//m为邻接矩阵
//n为终点的点号 即从V0到VN的点号
{
	int S[6]; S[0] = 0;
	int V[5][5];  V[0][0] = 1; V[0][1] = 2; V[0][2] = 3; V[0][3] = 4; V[0][4] = 5;
	//V第几行就是减了几次点。
	double DIST[5];//初始Dist矩阵
	for (int i = 1; i < 6; i++)
	{
		DIST[i-1] = m[0][i];//从V0出发到各点的距离作为初始值
	}
	double min; int num[6];//min用来找其中的最小值进行V,S调整,num来存贮其对应点号
	num[0] = 0;
	for (int s=1;s<6;s++)
	{
		min = DIST[V[s-1][0]-1]; num[s] = V[s - 1][0];//以第一个点为初值
	    for(int i = 1; i < 6-s; i++)
	    {
	     	if (DIST[V[s - 1][i]-1] < min)
		    {
			    min = DIST[V[s - 1][i]-1];
		     	num[s] = V[s - 1][i];
	      	}
     	}
     	S[s] = num[s];//更新S
		int t = 0;
		for (int i = 0; i < 6-s; i++)//更新V
		{
			if (V[s - 1][i] == num[s])
				t++;
			else V[s][i - t] = V[s - 1][i];
		}
		for (int i = 0; i < 5; i++)//更新DIST
		{
			if (DIST[i] > DIST[num[s]-1] + m[num[s]][i+1])
				DIST[i] = DIST[num[s]-1] + m[num[s]][i+1];
		}
		if (S[1] == n || S[2] == n || S[3] == n || S[4] == n || S[5] == n)
			break;//若不加此判断条件,循环结束DIST中即为点0到其余各点的最短距离
	}
	return DIST[n - 1];
}
int main()
{
	double a = 1;
	double inf = a / 0;//定义无穷大
	double m[6][6] = {
		inf,inf,10,inf,30,100,
		inf,inf,5,inf,inf,inf,
		inf,inf,inf,50,inf,inf,
		inf,inf,inf,inf,inf,10,
		inf,inf,inf,20,inf,60,
		inf,inf,inf,inf,inf,inf
	};//邻接矩阵
	double L1, L2, L3, L4, L5;
	L1 = Dijkstra(m, 1);//计算V0到V1的距离
	L2 = Dijkstra(m, 2);//计算V0到V2的距离
	L3 = Dijkstra(m, 3);//计算V0到V3的距离
	L4 = Dijkstra(m, 4);//计算V0到V4的距离
	L5 = Dijkstra(m, 5);//计算V0到V5的距离
	cout << "--------------------Dijkstra算法--------------------" << endl;
	cout << "V0到V1的距离:" << L1 << endl;
	cout << "V0到V2的距离:" << L2 << endl;
	cout << "V0到V3的距离:" << L3 << endl;
	cout << "V0到V4的距离:" << L4 << endl;
	cout << "V0到V5的距离:" << L5 << endl;
	return 0;
}

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
whu-river数据集是一个用于河流水质监测和预测的数据集。该数据集由华中科技大学收集和创建,旨在帮助研究人员和决策者更好地理解和管理河流的水质问题。 该数据集包含了来自中国不同河流的水质监测数据,包括河水的化学指标、生物学指标、水文学指标和气象指标等。这些指标可以帮助评估河流的污染程度和水质状况,并提供对河流水质变化的预测。数据集中的每个样本都包含了特定时间点对应的水质指标数值。 使用whu-river数据集,研究人员可以进行水质分析、趋势预测和模型构建等工作。例如,可以通过分析数据集中的化学指标,了解河流中各种物质的含量和分布情况,进而评估河流的水质状况。同时,还可以利用数据集中的生物学指标,评估河流的生态系统健康度。 此外,whu-river数据集还可以用于建立水质预测模型。通过对历史数据的分析和挖掘,可以发现不同指标之间的关联性和规律,从而构建出准确预测水质的模型。这样的模型可以对未来水质状况进行预测,为决策者提供科学依据,制定更为有效的水资源管理和保护措施。 总之,whu-river数据集是一个宝贵的资源,对于研究河流水质和水资源管理具有重要意义。它提供了丰富的水质监测数据,可用于水质分析、趋势预测和模型构建等工作,为保护水环境和维护水质做出贡献。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

WHU小疯子

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值