最短路问题之dijikstra算法


#include <iostream> 
#include <vector> 
#include <climits> 

using namespace std; 

// Dijkstra 算法函数 
vector<int> dijkstra(const vector<vector<int>>& graph, int source) { 
    int n = graph.size(); 
    // 用于记录从源点到各个顶点的最短距离,初始化为无穷大 
    vector<int> dist(n, INT_MAX); 
    // 用于标记顶点是否已确定最短路径,初始为 false 
    vector<bool> sptSet(n, false); 

    // 源点到自身的距离为 0 
    dist[source] = 0; 

    // 对每个顶点进行处理 
    for (int count = 0; count < n - 1; ++count) { 
        // 从未确定最短路径的顶点中选择距离最小的顶点 
        int minDist = INT_MAX, minIndex; 
        for (int v = 0; v < n; ++v) { 
            if (!sptSet[v] && dist[v] <= minDist) { 
                minDist = dist[v]; 
                minIndex = v; 
            } 
        } 

        // 标记该顶点为已确定最短路径 
        sptSet[minIndex] = true; 

        // 更新与该顶点相邻的顶点的最短距离 
        for (int v = 0; v < n; ++v) { 
            if (!sptSet[v] && graph[minIndex][v] && dist[minIndex] != INT_MAX && 
                dist[minIndex] + graph[minIndex][v] < dist[v]) { 
                dist[v] = dist[minIndex] + graph[minIndex][v]; 
            } 
        } 
    } 

    return dist; 
} 

int main() { 
    // 示例图的邻接矩阵 
    vector<vector<int>> graph = { 
        {0, 4, 0, 0, 0, 0, 0, 8, 0}, 
        {4, 0, 8, 0, 0, 0, 0, 11, 0}, 
        {0, 8, 0, 7, 0, 4, 0, 0, 2}, 
        {0, 0, 7, 0, 9, 14, 0, 0, 0}, 
        {0, 0, 0, 9, 0, 10, 0, 0, 0}, 
        {0, 0, 4, 14, 10, 0, 2, 0, 0}, 
        {0, 0, 0, 0, 0, 2, 0, 1, 6}, 
        {8, 11, 0, 0, 0, 0, 1, 0, 7}, 
        {0, 0, 2, 0, 0, 0, 6, 7, 0} 
    }; 

    int source = 0;  // 源点 
    vector<int> dist = dijkstra(graph, source); 

    // 输出从源点到各个顶点的最短距离 
    cout << "Vertex \t Distance from Source" << endl; 
    for (int i = 0; i < dist.size(); ++i) { 
        cout << i << " \t " << (dist[i] == INT_MAX ? "INF" : to_string(dist[i])) << endl; 
    } 

    return 0; 
}









评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值