Dijkstra算法—带权重的图的单源最短路径问题

Dijkstra算法—带权重的图的单源最短路径问题

图G<V,E>
集合S:从源点s到S集合中的所有点的最短路径已经被确定。

基于-贪心算法

  1. 松弛操作:刚确定一个点的最短路径后,遍历一遍与该点连接的点,更新这些点到源点s的距离。
  2. 从V-S的集合中找出距源点距离最短的点,将该点加入集合S中。

实现数据结构:

  1. map:用一个二维矩阵储存顶点的连接与距离信息
  2. distance:用一个一维矩阵储存单源点到各点的最短路径信息
  3. ss:当前松弛点;connect[i]标记i加入S;

代码块

  1. init:初始化将map初始化为∞;
  2. get_map:得到地图信息;
  3. Dijkstra:实现贪心算法;

具体代码如下

#include<iostream>
#include<stdio.h>
#define len 2510
#define INF 0x7ffffff
using namespace std;
int G[len][len];
void init(int n);
void get_map(int m);
int dijkstra(int n,int m,int s,int des);
int main(){
    int n,m,s,des;
    scanf("%d%d%d%d",&n,&m,&s,&des);
    init(n);
    get_map(m);
    printf("%d",dijkstra(n,m,s,des));
    return 0;
}
void init(int n){
    for(int i=1;i<=n;i++){
        for(int j=1;j<=n;j++)
            G[i][j]=INF;
    }
    for(int i=1;i<=n;i++){
        G[i][i]=0;
    }
}
void get_map(int m){
    int u,v,w;
    while(m--){
        scanf("%d%d%d",&u,&v,&w);
        G[u][v]=w;
        G[v][u]=w;
    }
}
int dijkstra(int n,int m,int s,int des){
    int S_count=0,div[len],connect[len];
    for(int i=1;i<=n;i++)
        div[i]=INF,connect[i]=0;
    S_count=1,div[s]=0,connect[s]=1;
    int ss=s;
    while(S_count<n){
        int div_min=INF,temp_ss;
        for(int i=1;i<=n;i++){
            if(connect[i]==0){
                if((div[ss]+G[ss][i])<div[i])
                    div[i]=div[ss]+G[ss][i];
                if(div[i]<div_min){
                    div_min=div[i];
                    temp_ss=i;
                }
            }
        }
        ss=temp_ss;
        connect[ss]=1;
        S_count++;
    }
    return div[des];
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值