迪杰斯特拉算法

本文介绍了一种使用C++实现的迪杰斯特拉最短路径算法。通过将顶点分为已访问和未访问两类,并利用dist[]数组记录源点到各顶点的距离,逐步更新最短路径直至求得所有顶点间的最短距离。

1.将所有顶点分为两部分,一本分是P放置已经访问过的顶点,另一部分是Q存放还没有访问过的顶点;设置一个book[]数组,值为0表示顶点未被访问,值为1表示顶点已经被访问过了;

2.设置dist[],dist[]表示源顶点到各个顶点之间的距离,其中源顶点到自身为0,其他顶点如果和源顶点相连则值为e[][],否则为最大值

3.找出离源点最近的节点u,设置节点u被访问过,考察所有以u为起点的边,进行松弛操作。比如存在从u到v的边,如果dist[u]+e[u][v]<dist[v],则用dist[u]+e[u][v]替代dist[v]

4.重复操作3,一直到Q中的所有点加入到P中

#include<iostream>
using namespace std;
int main()
{
int book[10]={0}; //标记数组,0表示该点没有被访问,1表示被访问过
int dist[10]; //表示第一个节点到各个节点的距离
int e[10][10]; //两个节点之间的距离
int n,m,enu,a,b,min=100,u;
cin>>n>>m; //n表示节点的数量,m表示边的数量
for(int i=0;i<n;++i) //初始化两个节点之间的距离
{
for(int j=0;j<n;++j)
{
if(i==j) //节点到自己的距离是0
e[i][j]=0;
else //两个节点之间的距离为最大值
e[i][j]=100;
}
}
for(int j=0;j<m;++j) //读入边
{
cin>>enu>>a>>b;
e[a][b]=enu;
}
for(int q=0;q<n;++q) //初始化dist[],为第一个节点到各个节点之间的距离
dist[q]=e[0][q];
book[0]=1;
for(int k=0;k<n-1;++k) //迪杰斯特拉算法核心
{
for(int h=0;h<n;++h) //找到离第一个节点最短的节点
{
if(book[h]==0&&dist[h]<min)
{
min=dist[h];
u=h;
}
}
book[u]=1;
for(int l=0;l<n;++l)
{
if(e[u][l]<100)
{
if(dist[l]>dist[u]+e[u][l])
dist[l]=dist[u]+e[u][l];
}
}
}
for(int p=0;p<n;++p)
cout<<"  "<<dist[p];
system("Pause");
return 0;
}
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值