最短路算法(Dijkstra) c++实现

最近想做最短路的题,就学了学Dijkstra算法,注释写的很详细。

代码

#include <stdio.h>
#define Max 0x3fffffff
int map[1005][1005]; // 记录每两个点之间的距离
int dis[1005];
void dijkstra(int n, int start) // 主算法
{
    int visit[1005] = {0};
    // k是未选择点中到起点距离最小的点,min是该点到起点的距离
    int min, i, j, k;
    visit[start] = 1;           // 起点标记
    for (int i = 0; i < n; i++) // 一个个点来
    {
        min = Max; // 每次循环都要把min归为最大
        for (int j = 0; j <= n; j++)
        {
            if (visit[j] == 0 && dis[j] < min)
            {
                min = dis[j];
                k = j;
            }
        }

        // 选择k点
        visit[k] = 1;

        // 更新剩余点的距离
        for (int j = 1; j <= n; j++)
        {
            if (visit[j] == 0 && dis[j] > dis[k] + map[k][j])
                dis[j] = dis[k] + map[k][j];
        }
    }
    printf("%d\n", dis[n]);
}
// 邻接矩阵输入,起点到每个点距离初始化
int main()
{
    // m是边数量,n是点数量, start是起点
    int m, n, from, to, cost, start;
    while (scanf("%d %d", &m, &n) != EOF)
    {
        for (int i = 1; i <= n; i++) // 输入
        {
            map[i][i] = 0;                   // 自己到自己的距离为0
            for (int j = 1; j < i; ++j)      // 其余各点的距离先标记为无穷大
                map[i][j] = map[j][i] = Max; // 双向都要标记
        }
        for (int i = 1; i <= m; i++) // 输入
        {
            scanf("%d %d %d", &from, &to, &cost);
            /*
            若之前已经存过该两点的距离了,那就比较这次的和上次的哪次更短,存距离更短的那次
            if (map[from][to] > cost)
            */
            map[from][to] = map[to][from] = cost;
        }
        scanf("%d", &start);

        for (int i = 1; i <= n; i++) // 存从起点到每个点的距离,最后要求的就是起点到终点的距离,不邻接的点距离是MAX
            dis[i] = map[start][i];
        dijkstra(n, start);
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值