Phân rã hữu ích

Đề bài

Mô tả

Cho một cây (đồ thị vô hướng liên thông không có chu trình) gồm n đỉnh.

Bạn cần phân rã các cạnh của cây thành một số đường đi đơn (simple path) sao cho:

  • Mỗi cạnh của cây thuộc về đúng một đường đi.
  • Hai đường đi bất kỳ trong phân rã đều có ít nhất một đỉnh chung.

Hãy tìm một phân rã thoả mãn hoặc cho biết không tồn tại.

Dữ liệu vào

  • Dòng đầu chứa số nguyên n — số đỉnh của cây.
  • n−1 dòng tiếp theo, mỗi dòng chứa hai số nguyên ai và bi mô tả một cạnh của cây (ai≠bi).

Dữ liệu đảm bảo các cạnh tạo thành một cây.

Dữ liệu ra

  • Nếu không tồn tại phân rã, in ra một dòng "No".
  • Ngược lại:
    • Dòng đầu in "Yes".
    • Dòng thứ hai in số nguyên m — số đường đi trong phân rã.
    • m dòng tiếp theo, mỗi dòng chứa hai số nguyên ui,vi (ui≠vi) mô tả một đường đi đơn từ ui tới vi.

Nếu có nhiều phân rã hợp lệ, in ra bất kỳ một phân rã nào.

Ràng buộc

  • 2≤n≤105
  • 1≤ai,bi≤n, ai≠bi

Ví dụ

Input Output Giải thích
4
1 2
2 3
3 4
Yes
1
1 4
Cây là đường thẳng 1−2−3−4. Một đường đi duy nhất từ 1 tới 4 phủ tất cả các cạnh.
6
1 2
2 3
3 4
2 5
3 6
No Cây có hai đỉnh phân nhánh là 2 và 3 (bậc ≥3). Không thể phân rã thoả điều kiện.
5
1 2
1 3
1 4
1 5
Yes
4
1 2
1 3
1 4
1 5
Cây hình sao tâm 1. Bốn đường đi từ 1 tới từng lá đều giao nhau tại đỉnh 1.

Bình luận

Không có bình luận tại thời điểm này.

gnatmake 12.2.0 a68g 3.1.2 nasm 2.16.1 as_x64 2.47 awk 1.3.4 gcc 16.2.0 dotnet 10.0.402 g++ 16.2.0 g++-themis 16.2.0 g++17 16.2.0 g++20 16.2.0 g++23 16.2.0 clang++ 22.1.8 dmd 2.113.0 dart 3.13.6 gforth 0.7.3 gfortran 15.3.0 go 1.27.3 groovyc 5.1.3 javac 26.0.2.1 node 26.12.1 julia 1.13.2 kotlinc 2.4.21 lean 4.35.0 sbcl 2.2.9 lua 5.5.1 nim 2.2.12 fpc 3.2.2 fpc-themis 3.2.2 perl 5.42.3 php 8.5.12 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.15.1 racket 8.7 ruby 4.0.8 rustc 1.99.1 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.4.1 tclsh 8.6 bun 1.4.4 deno 2.9.8 v 0.5.2 zig 0.17.0