记录_dijkstra最短路径

本文详细介绍Dijkstra算法的核心思想及其实现过程,通过示例展示如何寻找图中两点间最短路径,并提供完整的伪代码实现。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

dijkstra算法:

核心:

searchroot = (!visit[j]) && min(minpath[j])

//搜索节点为最短路径里面未被访问过的最小距离点

minpath[j] = min{minpath[searchroot]+map[searchroot][j],minpath[j]}

//最短路径为当前已知路径与搜索路径已知最短路径到当前结点的距离的最小值

 

设有 a,b,c,d,e 点, 另 最短路径为minint 初始化为MAX , 令起点为a 标记起点 令其处于已访问状态(找寻最小值的循环只需 a to e -1 次),

其中算法表示为:

 

for i = b to e

for j = a to e

if !visit[j] && minpath[j] < minint

minint = minpath[j]

searchroot = j

visit[searchroot]=1

for j = a to e

if !visit[j] && minpath[j] > minpath[searchroot] + map[searchroot][j]

minpath[j] = minpath[searchroot] + map[searchroot][j]

注:MAX 为无穷大,按邻接矩阵表示 自身到自身为 0 无法到达为 MAX

const int size=9;
const int MAX=1000000;
int minpath[size];
int visit[size];
int father[size];
int map[size][size]={
    { 0,4,MAX,MAX,MAX,MAX,MAX,8,MAX },
    { 4,0,8,MAX,MAX,MAX,MAX,11,MAX },
    { MAX,8,0,7,MAX,4,MAX,MAX,2 },
    { MAX,MAX,7,0,9,14,MAX,MAX,MAX },
    { MAX,MAX,MAX,9,0,10,MAX,MAX,MAX },
    { MAX,MAX,4,14,10,0,2,MAX,MAX },
    { MAX,MAX,MAX,MAX,MAX,2,0,1,6 },
    { 8,11,MAX,MAX,MAX,MAX,1,0,7 },
    { MAX,MAX,2,MAX,MAX,MAX,6,7,0 }
    };
int root=0;
for(int i=0;i<size;i++)
{
    father[i]=0;//初始化前驱点
    minpath[i]=map[root][i];//初始化权
    visit[i]=0;//初始化访问记录
}
visit[root]=1;
int searchroot;
for(int i=1;i<size;i++)
{//起始点已访问
    int mincost=MAX;
    for(int j=0;j<size;j++)
    {//找最小总权
        if((!visit[j])&&minpath[j]<mincost)
        {
            mincost=minpath[j];
            searchroot=j;
        }
    }
    visit[searchroot]=1;
    for(int j=0;j<size;j++)
    {
        if((!visit[j])&&minpath[j]>minpath[searchroot]+map[searchroot][j])
        {
            minpath[j]=minpath[searchroot]+map[searchroot][j];
            father[j]=searchroot;
        }
    }
}
for(int i=1;i<size;i++)
{
    cout<<"a to "<<(char)(i+'a')<<"'s minpath is "<<minpath[i]<<endl;
}
for(int i=1;i<size;i++)
{
    int lo=i;
    while(lo)
    {
        cout<<(char)(lo+'a')<<" <-- ";
        lo=father[lo];
    }
    cout<<'a'<<endl;
} 


dijkstra核心:找离起点最近点搜索。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值