Dijkstra算法

15 篇文章 0 订阅

Dijkstra算法,设无向连通图有n个点1~n,m条边,每条边连接a、b两点,边长为c,求点1到点n的最短路径的距离。

#include"bits/stdc++.h"
using namespace std;

int main(){

    int INF = 1e9+7;
    int n,m;
    cin>>n>>m;

    int map[n+7][n+7];
    int vis[n+7],dis[n+7];//vis数组表示已加入集合的点,dis存放点n到其余各点的最短距离
    memset(map,INF,sizeof(map));//最初图各点距离为INF
    for(int i=1;i<=n;++i){
        map[i][i]=0;
    }
    int a,b,c;
    for(int i=0;i<m;++i){
        cin>>a>>b>>c;
        if(map[a][b]>c){//设置边长
            map[a][b]=c;
            map[b][a]=c;
        }
    }
    memset(vis,0,sizeof(vis));
    for(int i=1;i<=n;++i){//初始化点n到各点的距离
        dis[i]=map[n][i];
    }
    vis[n]=1;//点n存放到集合
    for(int i=1;i<n;++i){
        int minn=INF;
        int tmp;
        for(int j=1;j<=n;++j){//找出到集合的最短距离的点j
            if(!vis[j]&&dis[j]<minn){
                minn=dis[j];
                tmp=j;//暂存j到tmp
            }
        }
        vis[tmp]=1;//点tmp加入集合
        for(int j=1;j<=n;++j){
            if(map[tmp][j]+dis[tmp]<dis[j]){//如果存在点tmp到集合的距离加上点tmp到点j的距离 比未更新前集合到点j的距离更近,则更新集合到点j的距离
                dis[j]=map[tmp][j]+dis[tmp];
            }
        }
    }
    cout<<dis[1];//输出点n到点1的距离

    return 0;
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值