Lê Hoàng Phúc

@2280602432
22DTHG8
Tham gia: 30.08.2023

Giới thiệu bản thân

#include <stdio.h>

#include <limits.h>


#define MAX 100

#define VOCUC INT_MAX


struct DoThi

{

    int n;

    int a[MAX][MAX];

};


int LuuVet[MAX];

int ChuaXet[MAX];

int DoDaiDuongDiToi[MAX];


void DSCsangMTK(DoThi &g)

{

    int m;

    scanf("%d %d", &g.n, &m);

    for (int i = 1; i <= g.n; i++)

    {

        for (int j = 1; j <= g.n; j++)

        {

            g.a[i][j] = VOCUC;

        }

    }

    for (int i = 0; i < m; i++)

    {

        int u, v, w;

        scanf("%d %d %d", &u, &v, &w);

        g.a[u][v] = w;

    }

}


int TimDuongDiNhoNhat(DoThi g)

{

    int li = -1;

    int p = VOCUC;

    for (int i = 1; i <=g.n; i++)

    {

        if (ChuaXet[i] == 0 && DoDaiDuongDiToi[i] != VOCUC && DoDaiDuongDiToi[i] < p)

        {

            p = DoDaiDuongDiToi[i];

            li = i;

        }

    }

    return li;

}


void CapNhatDuongDi(int u, DoThi g)

{

    ChuaXet[u] = 1;

    for (int v = 1; v <=g.n; v++)

    {

        if (ChuaXet[v] == 0 && g.a[u][v] < VOCUC)

        {

            if (DoDaiDuongDiToi[v] > DoDaiDuongDiToi[u] + g.a[u][v])

            {

                DoDaiDuongDiToi[v] = DoDaiDuongDiToi[u] + g.a[u][v];

                LuuVet[v] = u;

            }

        }

    }

}

void InDuongDi(int start, int end)

{

    if (LuuVet[end] == -1)

    {

        printf("%d ", start);

        return;

    }

    InDuongDi(start, LuuVet[end]);

    printf("%d ", end);

}


void Dijkstra(int S, int F, DoThi &g)

{

    if (S < 1 || S > g.n || F < 1 || F > g.n)

    {

        printf("-1\n");

        return;

    }


    for (int i = 1; i <= g.n; i++)

    {

        ChuaXet[i] = 0;

        DoDaiDuongDiToi[i] = VOCUC;

        LuuVet[i] = -1;

    }

    DoDaiDuongDiToi[S] = 0;

    while (ChuaXet[F] == 0)

    {

        int u = TimDuongDiNhoNhat(g);

        if (u == -1)

            break;

        CapNhatDuongDi(u, g);

    }

    if (ChuaXet[F] == 1 && DoDaiDuongDiToi[F] != VOCUC)

    {

        printf("%d\n", DoDaiDuongDiToi[F]);

        InDuongDi(S, F);

        printf("\n");

    }

    else

        printf("-1\n");

}


 


int main()

{

    DoThi g;

    DSCsangMTK(g);


    int start, end;

    scanf("%d", &start);

    scanf("%d", &end);


    Dijkstra(start, end, g);


    return 0;

}

Tổng bài nộp
0
Đã giải đúng
0
Tỉ lệ chính xác
0%

Bài tập đã giải đúng (0)

Chưa có bài tập nào được giải đúng.

Bài tập chưa hoàn thành (0)

Tuyệt vời! Bạn không còn bài tập nào dang dở.

Điểm danh tháng 04/2026

Để ghi nhận điểm danh và giữ chuỗi, bạn cần Giải đúng (AC) 1 bài tập mới HOẶC Đóng góp 1 bài tập mỗi ngày.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
Chuỗi hiện tại
0
Chuỗi kỷ lục
0

Hoạt động nộp bài

Chưa có dữ liệu nộp bài.