迪杰斯特拉

23 篇文章 0 订阅
#include <bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
int n,m,g[105][105],dis[105];
int a,b,c;
bool vis[105];
void di()
{
    for(int i=1; i<=n; i++) {// 首先将顶点与1的相关联的点拿出来 。
        dis[i]=g[1][i];// 将 连接上点的权值给dis
    }
    dis[1]=0;// 本点与本点的距离记为0.
    vis[1]=true; //
    for(int i=2; i<=n; i++) {
        int min_num=INF,pos;// 初始化min_num 为一个极大的数字。
        for(int j=1; j<=n; j++) {

            if(vis[j]==false&&dis[j]<min_num) {
                min_num=dis[j];
                pos=j;//   pos 记录  与当前点相邻的下一个点
            }
        }
        vis[pos]=true;//将 pos带入计算  找下一个与pos 相邻的点
        for(int j=1; j<=n; j++) {
            if(vis[j]==false&&dis[j]>(dis[pos]+g[pos][j])) {
                dis[j]=dis[pos]+g[pos][j];
            }
        }
    }
}
int main()
{
    cin>>n>>m;
    memset(g,INF,sizeof(g));
    memset(dis,0,sizeof(dis));
    memset(vis,false,sizeof(vis));
    for(int i=0; i<m; i++) {
        cin>>a>>b>>c;
        g[a][b]=c; // 正反个录入一依次,做出领接表
        g[b][a]=c;
    }
    di();
   for(int i=1;i<=n;i++)
   cout<<dis[i]<<" ";
    return 0;
}
3 3
1 2 5
2 3 5
3 1 2


2
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值