Dijkstra算法详解

#include <iostream>
#include <algorithm>
using namespace std;

const int inf = 0x7fffffff;
const int MAXN = 105;

int n, e, s;//n个点,e条边,起点为s
int dis[MAXN], check[MAXN];//dis里的每个值都代表从起点到该店的距离,check代表这个距离目前是不是最优的距离,如果是最优距离才设为1
int graph[MAXN][MAXN];

int main() {
    // Initialize graph and distances
    cin >> n >> e;

    for (int i = 1; i <= n; i++) {
        dis[i] = inf;  // 每个点距离都为无穷大
        for (int j = 1; j <= n; j++) {
            graph[i][j] = inf;  // No edges initially
        }
    }
    
    for (int i = 1; i <= e; i++) {
        int a, b, c;
        cin >> a >> b >> c;  // Edge from a to b with weight c
        graph[a][b] = c;      // Store the edge weight
         //如果是无向图还要把 graph[b][a] = c; 写上,但现在规定是有向的
         
    }
    
    cin >> s;  // 起点
    dis[s] = 0;  // 起点和起点的距离当然是0了
    
    for (int i = 1; i <= n; i++) {//循环n次
        int minn = inf, minx = -1;
        //每次循环要找距离目前起点最短路径上的顶点
        for (int j = 1; j <= n; j++) {
            if (dis[j] < minn && check[j] == 0) {//第一次最大循环的第一个小循环找到的minn肯定是0,而且minx是1
                minn = dis[j];
                minx = j;
            }
        }
        
        if (minx == -1) break;  
        //找到最近路径上1的一点了,把点标记了
        check[minx] = 1; 
        for (int j = 1; j <= n; j++) {//这个循环的目的是拿找到的minn的点去看有没有和这个点通往的,如果有,那就比较dis[minx] + graph[minx][j]和dis[j]
            if (check[j] == 0 && graph[minx][j] < inf) {
                if (dis[minx] + graph[minx][j] < dis[j]) {
                    dis[j] = dis[minx] + graph[minx][j];
                }
            }
        }
    }

    // Output the shortest distances
    for (int i = 1; i <= n; i++) {
        if (dis[i] == inf) cout << "INF ";
        else cout << dis[i] << " ";
    }
    
    return 0;
}

Dijkstra算法的前提是每个边的都是正数,如果有负数的情况那就不适用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值