https://algs4.cs.princeton.edu/44sp/AcyclicLP.java
relax các cạnh có trọng số -1 (ko cần -1 cũng được) của các đỉnh đã được sắp xếp theo thứ tự topo, O(V+E) thôi
vd tìm đường đi dài nhất từ 8 tới 9
1 → 2 → 3
↑ ↓
4 5 → 6
↑ ↑ ↓
7 ← 8 → 9
sắp xếp topo thì thứ tự các đỉnh có thể là 8 7 5 4 1 2 3 6 9
relax các cạnh:
ban đầu:
1(0) → 2(0) → 3(0)
↑ ↓
4(0) 5(0) → 6(0)
↑ ↑ ↓
7(0) ← 8(0) → 9(0)
relax các cạnh của 8: giá trị của vert7 từ 0 thành 1, vert5 từ 0 thành 1, vert9 từ 0 thành 1
1(0) → 2(0) → 3(0)
↑ ↓
4(0) 5(1) → 6(0)
↑ ↑ ↓
7(1) ←*8(0) → 9(1)
relax các cạnh của 7: giá trị vert4 từ 0 thành 2
1(0) → 2(0) → 3(0)
↑ ↓
4(2) 5(1) → 6(0)
↑ ↑ ↓
*7(1) ← 8(0) → 9(1)
relax các cạnh của 5: giá trị vert6 từ 0 thành 2
1(0) → 2(0) → 3(0)
↑ ↓
4(2) *5(1) → 6(2)
↑ ↑ ↓
7(1) ← 8(0) → 9(1)
relax các cạnh của 4: giá trị vert1 từ 0 thành 3
1(3) → 2(0) → 3(0)
↑ ↓
*4(2) 5(1) → 6(2)
↑ ↑ ↓
7(1) ← 8(0) → 9(1)
relax các cạnh của 1: giá trị vert2 từ 0 thành 4
*1(3) → 2(4) → 3(0)
↑ ↓
4(2) 5(1) → 6(2)
↑ ↑ ↓
7(1) ← 8(0) → 9(1)
relax các cạnh của 2: giá trị vert3 từ 0 thành 5
1(3) →*2(4) → 3(5)
↑ ↓
4(2) 5(1) → 6(2)
↑ ↑ ↓
7(1) ← 8(0) → 9(1)
relax các cạnh của 3: giá trị vert6 từ 2 thành 6
1(3) → 2(4) →*3(5)
↑ ↓
4(2) 5(1) → 6(6)
↑ ↑ ↓
7(1) ← 8(0) → 9(1)
relax các cạnh của 6: giá trị vert9 từ 1 thành 7
1(3) → 2(4) → 3(5)
↑ ↓
4(2) 5(1) →*6(6)
↑ ↑ ↓
7(1) ← 8(0) → 9(7)
relax các cạnh của 9:
1(3) → 2(4) → 3(5)
↑ ↓
4(2) 5(1) → 6(6)
↑ ↑ ↓
7(1) ← 8(0) →*9(7)
đã sx theo thứ tự topo rồi thì lúc relax cạnh update giá trị của các đỉnh đối diện khỏi cần so sánh luôn vì trọng số các cạnh ở đây bằng nhau
nếu cùng graph này mà hỏi đi từ 5 tới 9 thì ban đầu giá trị khởi tạo = 0 ko đúng Vậy ban đầu nên khởi tạo giá trị invalid nào đó. Nếu đỉnh đang xét có giá trị invalid thì ignore nó đi:
ban đầu: khởi tạo tất cả giá trị của các vert là invalid (i), ngoại trừ vert 5 bắt đầu có giá trị là 0
1(i) → 2(i) → 3(i)
↑ ↓
4(i) *5(0) → 6(i)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 8: 8 có giá trị invalid, bỏ qua
1(i) → 2(i) → 3(i)
↑ ↓
4(i) 5(0) → 6(i)
↑ ↑ ↓
7(i) ←*8(i) → 9(i)
relax các cạnh của 7: 7 có giá trị invalid, bỏ qua
1(i) → 2(i) → 3(i)
↑ ↓
4(i) 5(0) → 6(i)
↑ ↑ ↓
*7(i) ← 8(i) → 9(i)
relax các cạnh của 5: giá trị vert6 từ i thành 1
1(i) → 2(i) → 3(i)
↑ ↓
4(i) *5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 4: 4 có giá trị invalid, bỏ qua
1(i) → 2(i) → 3(i)
↑ ↓
*4(i) 5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 1: 1 có giá trị invalid, bỏ qua
*1(i) → 2(i) → 3(i)
↑ ↓
4(i) 5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 2: 2 có giá trị invalid, bỏ qua
1(i) →*2(i) → 3(i)
↑ ↓
4(i) 5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 3: 3 có giá trị invalid, bỏ qua
1(i) → 2(i) →*3(i)
↑ ↓
4(i) 5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(i)
relax các cạnh của 6: giá trị vert9 từ i thành 2
1(i) → 2(i) → 3(i)
↑ ↓
4(i) 5(0) →*6(1)
↑ ↑ ↓
7(i) ← 8(i) → 9(2)
relax các cạnh của 9:
1(i) → 2(i) → 3(i)
↑ ↓
4(i) 5(0) → 6(1)
↑ ↑ ↓
7(i) ← 8(i) →*9(2)