最短路——Dijkstra算法

 模板

 水模板ing

#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <queue>
#define MAX 9999999

using namespace std;

int G[203][203];//二维数组 图的存储
int n, s, t;//n 点的个数 , s 起点 ,t 终点

void dijkstra()
{
    bool vis[203];//相当于集合Q的功能, 标记该点是否访问过
    int dis[203];//保存最短路径
    int i, j, k;
    for(i=0;i<n;i++)//初始化
        dis[i] = G[s][i];//s—>各个点的距离
    memset(vis,false,sizeof(vis));//初始化为假 表示未访问过
    dis[s] = 0;//s->s 距离为0
    vis[s] = true;//s点访问过了,标记为真
    for(i=1;i<n;i++)//G.V-1次操作+上面对s的访问 = G.V次操作
    {
        k = -1;
        for(j=0;j<n;j++)//从尚未访问过的点中选一个距离最小的点
            if(!vis[j] && (k==-1||dis[k]>dis[j]))//未访问过 && 是距离最小的
                k = j;
        if(k == -1)//若图是不连通的则提前结束
            break;//跳出循环
        vis[k] = true;//将k点标记为访问过了
        for(j=0;j<n;j++)//松弛操作
           if(!vis[j] && dis[j]>dis[k]+G[k][j])//该点为访问过 && 可以进行松弛
                dis[j] = dis[k]+G[k][j];//j点的距离  大于当前点的距离+w(k,j) 则松弛成功,进行更新
    }
    printf("%d\n",dis[t]==MAX?-1:dis[t]);//输出结果
}
int main()
{
    int m, i, j, u, v, w;
    while(scanf("%d %d",&n,&m)==2)
    {//获取点的个数 边的个数
        for(i=0;i<n;i++)
            for(j=0;j<n;j++)
                G[i][j] = i==j?0:MAX;//初始化,本身到本身的距离为0,其他的为无穷大
        while(m--){
            scanf("%d %d %d",&u,&v,&w);//获取u,v,w(u,v);
            if(G[u][v]>w)//因为初始化的操作  && 若有重边要去最小的权重值
                G[u][v] = G[v][u] = w;//无向图 双向
        }
        scanf("%d %d",&s,&t);//获取起止点
        dijkstra();
    }
    return 0;
}

 

转载于:https://www.cnblogs.com/z360/p/6790239.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值