Untitled

mail@pastecode.io avatar
unknown
c_cpp
a month ago
2.2 kB
3
Indexable
Never
#include <iostream>
#include <vector>
#include <climits>

using namespace std;

const int INF = INT_MAX; // Định nghĩa giá trị vô cùng

void dijkstra(int start, const vector<vector<int>>& graph, vector<int>& dist, vector<int>& prev) {
    int n = graph.size(); // Số lượng đỉnh trong đồ thị
    vector<bool> visited(n, false); // Danh sách đánh dấu các đỉnh đã xét

    dist[start] = 0; // Khoảng cách từ đỉnh xuất phát đến chính nó là 0

    for (int i = 0; i < n; ++i) {
        // Tìm đỉnh có khoảng cách nhỏ nhất chưa được xét
        int u = -1;
        int min_dist = INF;

        for (int j = 0; j < n; ++j) {
            if (!visited[j] && dist[j] < min_dist) {
                min_dist = dist[j];
                u = j;
            }
        }

        if (u == -1) break; // Không tìm thấy đỉnh mới, dừng thuật toán

        visited[u] = true; // Đánh dấu đỉnh u đã được xét

        // Cập nhật khoảng cách tới các đỉnh kề của u
        for (int v = 0; v < n; ++v) {
            if (graph[u][v] != 0 && !visited[v]) { // Có cạnh nối u đến v và v chưa được xét
                int new_dist = dist[u] + graph[u][v];
                if (new_dist < dist[v]) { // Nếu khoảng cách mới nhỏ hơn
                    dist[v] = new_dist; // Cập nhật khoảng cách
                    prev[v] = u; // Lưu đỉnh trước đó
                }
            }
        }
    }
}

int main() {
    int n = 5; // Số đỉnh
    vector<vector<int>> graph = {
        {0, 10, 3, 0, 0},
        {0, 0, 1, 2, 0},
        {0, 4, 0, 8, 2},
        {0, 0, 0, 0, 7},
        {0, 0, 0, 9, 0}
    };

    vector<int> dist(n, INF); // Mảng lưu khoảng cách ngắn nhất từ đỉnh xuất phát
    vector<int> prev(n, -1); // Mảng lưu đỉnh liền kề trước đó trong đường đi ngắn nhất

    int start = 0; // Đỉnh bắt đầu
    dijkstra(start, graph, dist, prev);

    for (int i = 0; i < n; ++i) {
        cout << "Khoảng cách từ " << start << " đến " << i << " là " << dist[i] << endl;
    }

    return 0;
}
Leave a Comment