#include <iostream>
#include <memory>
using namespace std;
const int maxint = 9999999;
const int maxn = 1010;
int data[maxn][maxn], lowcost[maxn];//data 存放点点之间的距离, lowcost存放点到start 的距离,从0开始存放
bool used[maxn]; //标记点是否被选中
int n; //顶点的个数
void dijsktra( int start ) //初始点是start的dijkstra 算法
{
int i, j;
memset( used, 0, sizeof(used) ); //初始所有点都未被标记
for( i = 0; i < n; i++ )
lowcost[i] = data[start][i]; //初始点到其他所有点的距离
used[start] = true; //初始点被标记
lowcost[start] = 0; //初始点到自身永远是0, 最短的路径
for( i = 0; i < n-1; i++ ) //因为第一个点start已经选过了,所有还剩下n-1个点
{
//choose min 选择一个点
int tempmin = maxint;
int choose;
for( j = 0; j < n; j++ ) //一轮循环表示选出一个点
{
if( !used[j] && tempmin > lowcost[j] ) //类似max值动态更新
{
choose = j;
tempmin = lowcost[j];
}
}
used[choose] = true; //被选中的点被标记 最后选出了一个choose点
// updata others 更新lowcost[]
for( j = 0; j < n; j++ )
{
if( !used[j] && data[choose][j] < maxint && lowcost[choose] + data[choose][j] < lowcost[j] )
/* 找 choose到 其他未选中的距离存在的点 < maxint表示距离存在 && start点到choose的距离+ choose点到这个点的距离 < start点到这个点的距离 */
lowcost[j] = lowcost[choose] + data[choose][j]; //如果满足上面那个if条件的话则更新数组
}
}
}
dijkstra O(n2) 算法模版
最新推荐文章于 2024-08-19 15:53:09 发布