dijkstra算法入门

本文介绍如何使用Dijkstra算法解决无向连通图中从指定起点到各个结点的最短路径问题。通过邻接矩阵存储边长,并逐步扩展结点来更新最短路径。

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

【题目描述】无向连通图 G 有 n 个结点,依次编号为 0,1,2,…,(n-1)。用邻接矩阵的
形式给出每条边的边长,要求输出以结点 0 为起点出发,到各结点的最短路径长度。
使用 Dijkstra 算法解决该问题:利用 dist 数组记录当前各结点与起点的已找到的最
短路径长度;每次从未扩展的结点中选取 dist 值最小的结点 v 进行扩展,更新与 v 相邻的结点的 dist 值;不断进行上述操作直至所有结点均被扩展,此时 dist 数据中记录的值即为各结点与起点的最短路径长度。
【示意图】
这里写图片描述

【参考代码】

#include<bits/stdc++.h> 
using namespace std;
const int MAXV=100;
int n,i,j,v;//n个节点,从节点i-节点j;
int w[MAXV][MAXV];//邻接矩阵,记录边长;
//其中w[i][j]为连接节点i,j方向边的长度 ,若无边为-1;
int dist[MAXV];//
int used[MAXV];//记录节点是否扩展(0:未扩展,1:已扩展);
int main(){
    cin>>n;
    for(i=0;i<n;i++)
       for(j=0;j<n;j++)
       cin>>w[i][j];//输入边权; 
       dist[0]=0;//dist[i]值原点到i的距离 
    for(i=1;i<n;i++)
    dist[i]=-1;
    for(i=0;i<n;i++)
    used[i]=0;
    while(true){
        v=-1;
        for(i=0;i<n;i++)
        if(used[i]!=1&&dist[i]!=-1&&(v==-1||dist[i]<=dist[v]))//如果节点已被扩展
        //且从原点到i的距离不为-1 
        v=i;
        if(v==-1)
        break;
        used[v]=1;
        for(i=0;i<n;i++)
        if(w[v][i]!=-1&&(dist[i]==-1||dist[v]+w[v][i]<=dist[i]))//最短路径 
        dist[i]=dist[v]+w[v][i];
    }
    for(i=0;i<n;i++)
    cout<<dist[i]<<endl;
    return 0; 
} 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值