Để giải bài toán này, ta có thể áp dụng thuật toán Dijkstra để tìm đường đi ngắn nhất trong đồ thị có trọng số thay đổi theo thời gian. Dưới đây là các bước thực hiện:
1. **Khởi tạo**:
- Gán nhãn cho đỉnh 1 bằng 0 (thời gian bắt đầu), và tất cả các đỉnh khác bằng ∞.
- Sử dụng một hàng đợi ưu tiên (priority queue) để lưu trữ các đỉnh cần được xử lý.
2. **Thực hiện thuật toán**:
- Lấy đỉnh có nhãn nhỏ nhất từ hàng đợi.
- Xét tất cả các đỉnh kề với đỉnh hiện tại.
- Đối với mỗi đỉnh kề, tính thời gian đi đến đỉnh đó với công thức:
- Cập nhật nhãn của đỉnh kề nếu thời gian đi đến đỉnh đó nhỏ hơn nhãn hiện tại.
- Thêm đỉnh kề vào hàng đợi với thời gian mới.
3. **Kết thúc**:
- Khi đỉnh n được khoanh tròn, in ra nhãn của nó (thời gian ngắn nhất để đi từ đỉnh 1 đến đỉnh n).
- Nếu không còn đỉnh nào trong hàng đợi và đỉnh n vẫn có nhãn là ∞, in ra -1.
Dưới đây là một ví dụ về cách cài đặt thuật toán này bằng Python:
```python
import heapq
import math
def dijkstra(graph, n, T):
# Khởi tạo
min_time = [float('inf')] * (n + 1)
min_time[1] = 0
pq = [(0, 1)] # (thời gian, đỉnh)
while pq:
current_time, u = heapq.heappop(pq)
if current_time > min_time[u]:
continue
for v, w in graph[u]:
# Tính thời gian đến đỉnh v
time_to_v = current_time + 1
actual_weight = w * (time_to_v // T) + w
arrival_time = current_time + actual_weight
if arrival_time < min_time[v]:
min_time[v] = arrival_time
heapq.heappush(pq, (arrival_time, v))
return min_time[n] if min_time[n] != float('inf') else -1
# Ví dụ sử dụng
n = 5 # số đỉnh
T = 2 # chu kỳ thay đổi trọng số
graph = {
1: [(2, 3), (3, 2)],
2: [(4, 1)],
3: [(4, 4), (5, 2)],
4: [(5, 3)],
5: []
}
result = dijkstra(graph, n, T)
print(result) # In ra thời gian nhỏ nhất từ đỉnh 1 đến đỉnh n
```
Trong ví dụ trên, bạn sẽ cần điều chỉnh đồ thị `graph` theo yêu cầu cụ thể của bài toán. Hãy nhớ rằng nếu không thể đến đỉnh n, chương trình sẽ in ra -1.