canuc80k3004·5/50

Tuyến Truyền Tin Ngắn Nhất

Nộp bài trên LQDOJ

Bài 3.1 · DFS and BFS

Một hệ thống gồm máy tính được đánh số từ đến và kết nối hai chiều. Cần truyền một thông điệp từ máy tới máy qua các kết nối đã có.

Một tuyến truyền tin là một dãy máy bắt đầu bằng , kết thúc bằng , trong đó hai máy liên tiếp được nối trực tiếp. Hãy tìm tuyến chứa ít máy nhất. Nếu có nhiều tuyến tối ưu, có thể in bất kỳ tuyến nào.

Input

  • Dòng đầu chứa hai số nguyên và .
  • Mỗi dòng trong dòng tiếp theo chứa hai số nguyên và , cho biết có một kết nối hai chiều giữa hai máy đó. Mỗi kết nối nối hai máy khác nhau và không có hai kết nối trùng nhau.

Output

  • Nếu không tồn tại tuyến từ máy tới máy , in IMPOSSIBLE.
  • Ngược lại, dòng đầu in số nguyên , là số máy trên một tuyến ngắn nhất. Dòng tiếp theo in số là các máy của tuyến theo đúng thứ tự đi từ tới .

Constraints

  • .
  • .
  • .
  • Không có hai kết nối trùng nhau.

Scoring

  • Subtask ( số điểm): .
  • Subtask ( số điểm): Không có giới hạn bổ sung.

Example

Test 1

Input

7 7
1 2
2 3
3 7
1 4
4 5
5 6
6 7

Output

4
1 2 3 7

Giải thích: Tuyến chứa bốn máy. Mọi tuyến đi qua các máy chứa ít nhất năm máy, nên tuyến đã in là tối ưu.

Lời giải tóm tắt
  • Ý tưởng: Chạy BFS từ máy 1. Khi một máy to được thăm lần đầu từ máy v, lưu parent[to] = v. BFS xử lý các máy theo từng lớp khoảng cách, vì vậy lần thăm đầu tiên luôn dùng số kết nối ít nhất.
  • Ý tưởng: Nếu máy n không được thăm, không có tuyến và ta in IMPOSSIBLE. Ngược lại, lần theo mảng parent từ n về 1, đảo dãy thu được rồi in số phần tử cùng tuyến đó. Tối thiểu số kết nối cũng tương đương tối thiểu số máy vì một tuyến có e kết nối luôn chứa e+1 máy.
  • Ý tưởng: Mỗi máy và mỗi kết nối được xử lý số lần hằng, nên độ phức tạp là O(n+m) thời gian và O(n+m) bộ nhớ.