Giả sử có n số thành phố và các thành phố được kết nối với hai loại đường; đường cao tốc và đường tắt. Bây giờ, có một bản đồ và chỉ có các đường cao tốc trên bản đồ và tất cả các lối tắt đều không có. Bộ phận giao thông của các thành phố muốn khởi động một phương tiện giao thông kết nối các thành phố bằng cách sử dụng đường cao tốc và đường tắt. Chúng tôi biết có một con đường tắt giữa hai thành phố khi không có đường cao tốc giữa chúng. Nhiệm vụ của chúng tôi ở đây là tìm khoảng cách tối thiểu về đường tắt từ một thành phố xuất phát đến tất cả các thành phố khác.
Vì vậy, nếu đầu vào giống như
và (các) đỉnh bắt đầu là 1, thì đầu ra sẽ là 3 1 2.
Nếu chúng ta chỉ đi đường tắt, con đường giữa thành phố 1 và 2 sẽ là 1-> 3-> 4-> 2 và chi phí sẽ là 3.
Tương tự,
1 và 3:1-> 3, chi phí 1.
1 và 4:1-> 3-> 4, chi phí 2.
Để giải quyết vấn đề này, chúng tôi sẽ làm theo các bước sau -
- graph:=một danh sách mới chứa n bộ
- đối với mỗi cặp (x, y) trong các cạnh, thực hiện
- x:=x - 1
- y:=y - 1
- chèn y vào biểu đồ [x]
- chèn x vào biểu đồ [y]
- temp_arr:=một mảng mới có kích thước n chứa giá trị -1
- b_set:=một bản đồ mới chứa khóa s-1
- f:=một tập hợp mới chứa sự khác biệt giữa các số từ 0 đến n và b_set
- index:=0
- trong khi kích thước của b_set> 0, thực hiện
- đối với mỗi phần tử a trong b_set, thực hiện
- temp_arr [a]:=index
- nxt:=một bản đồ mới chứa các giá trị của đồ thị không phải là tập con của b_set
- f:=đặt chênh lệch của f và nxt
- b_set:=nxt
- index:=index + 1
- đối với mỗi phần tử a trong b_set, thực hiện
- trả về các giá trị khác 0 của temp_arr
Ví dụ
Hãy cùng chúng tôi xem cách triển khai sau để hiểu rõ hơn -
def giải quyết (n, cạnh, s):graph =[set () for i in range (n)] for (x, y) in edge:x - =1 y - =1 graph [x] .add (y) graph [y] .add (x) temp_arr =[-1] * n b_set ={s - 1} f =set (range (n)). difference (b_set) index =0 while len (b_set)> 0:for a in b_set:temp_arr [a] =index nxt ={f for f in f if not b_set.issubset (graph [f])} f =f.difference (nxt) b_set =nxt index + =1 return ( '' .join (str (t) cho t trong temp_arr nếu t> 0)) print (giải (4, [(1, 2), (2, 3), (1, 4)], 1))Đầu vào
4, [(1, 2), (2, 3), (1, 4)], 1Đầu ra
3 1 2