Trở về đầu

foto1 foto2 foto3 foto4 foto5
Giảng viên
Nguyễn Tô Sơn - Thủ khoa Đại học Sư phạm Hà Nội
ĐT: 091.333.2869

HỌC TIN CÙNG THỦ KHOA

Thành công không phải đích đến, mà là cả một hành trình

Tìm kiếm

Mời các bạn Download code tại: Click here

1. File Input: Click here

- Dòng đầu tiên gồm 3 số n, s, t tương ứng là số đỉnh, đỉnh bắt đầu và đỉnh kết thúc để tìm đường đi dài nhất từ s tới t.

- n dòng tiếp theo, mỗi dòng gồm n số là ma trận trọng số của đồ thị, trong đó quy ước a[i, j] = 0 nếu không có đường đi trực tiếp từ i tới j.

2. File Output

- Ghi ra độ dài đường đi dài nhất từ s tới t.

- Hiển thị đường đi dài nhất từ s tới t (mỗi đỉnh xuất hiện đúng một lần trên đường đi).

Chú ý: Thuật toán chỉ áp dụng cho đồ thị có hướng, không chứa chu trình.

Program ThuatToanFloyd;
{ Tim duong di dai nhat tren do thi co huong, khong co chu trinh, moi dinh xuat hien dung mot lan tren duong di }
const fi = 'FLOYD.INP';
      fo = 'FLOYD.OUT';
      MAXN = 100;
      VoCung = MAXINT div 2;
var a: array [1..MAXN, 1..MAXN] of integer;
    n, s, t: integer;
    Truoc: array [1..MAXN, 1..MAXN] of integer;
    f: text;

    procedure Nhap;
    var i, j: integer;
    begin
        assign(f, fi); reset(f);
        readln(f, n, s, t);
        for i:= 1 to n do
                for j:= 1 to n do
                begin
                        read(f, a[i, j]);
                        a[i, j]:= -a[i, j];
                        Truoc[i, j]:= i;
                        if (a[i, j] = 0) and (i <> j) then
                                a[i, j]:= +VoCung;
                end;
        close(f);
    end;

    procedure Floyd;
    var k, u, v: integer;
    begin
        for k:= 1 to n do
                for u:= 1 to n do
                        for v:= 1 to n do
                                  if a[u, v] > a[u, k] + a[k, v] then
                                  begin
                                        a[u, v]:= a[u, k] + a[k, v];
                                        Truoc[u, v]:= Truoc[k, v];
                                  end;
    end;

    procedure TruyVet(u, v: integer);
    var k: integer;
    begin
        k:= Truoc[u, v];
        if k = u then
                write(f, ' -> ', v)
                else
                begin
                        TruyVet(u, k);
                        TruyVet(k, v);
                end;
    end;

    procedure KetQua;
    begin
        assign(f, fo); rewrite(f);
        writeln(f, -a[s, t]);
        write(f, s);
        TruyVet(s, t);
        close(f);
    end;

BEGIN
        Nhap;
        Floyd;
        KetQua;
END.

Giảng viên Nguyễn Tô Sơn, Thủ khoa Đại học Sư phạm Hà Nội. Điện thoại: 091.333.2869