#1394. Chu trình Euler (TOUR)

Bộ nhớ: 512 MiB Thời gian: 1000 ms Nhập/xuất từ luồng chuẩn
Kiểu bài: Thông thường Kiểu chấm: Trình chấm ngoài
Đưa lên bởi: Trùm CUỐI

Đề bài

Một ngày nọ, một họa sĩ đã vẽ một bức tranh (đồ thị), bây giờ bạn cần tìm chu trình Euler, tức là tìm một vòng trong đồ thị sao cho mỗi cạnh xuất hiện trong vòng đó đúng một lần.

Có hai bài toán con (subtasks):

  1. Đồ thị là vô hướng. ( 50 điểm)
  2. Đồ thị là có hướng. ( 50 điểm)

Dữ liệu:

  • Dòng đầu tiên chứa một số nguyên t , biểu thị mã bài toán con. t \in \{1, 2\} . Nếu t = 1 xử lý đồ thị vô hướng, nếu t = 2 xử lý đồ thị có hướng.
  • Dòng thứ hai chứa hai số nguyên n, m , biểu thị số đỉnh và số cạnh của đồ thị.
  • Tiếp theo là m dòng, dòng thứ i chứa hai số nguyên v_i, u_i , biểu thị cạnh thứ i (đánh số từ 1 ). Đảm bảo 1 \leq v_i, u_i \leq n .
    1. Nếu t = 1 , v_i u_i có một cạnh vô hướng.
    2. Nếu t = 2 , có một cạnh có hướng từ v_i đến u_i .
  • Đồ thị có thể có đa cạnh hoặc khuyên (tự vòng).

Kết quả:

  • Nếu không thể vẽ được bằng một nét (không có chu trình Euler), in ra một dòng NO.
  • Ngược lại, in ra một dòng YES, dòng tiếp theo in ra một phương án:
    1. Nếu t = 1 , in ra m số nguyên p_1, p_2, \dots, p_m . Đặt e = |p_i| , thì e là số hiệu của cạnh thứ i đi qua. Nếu p_i dương biểu thị đi từ v_e đến u_e , nếu âm biểu thị đi từ u_e đến v_e .
    2. Nếu t = 2 , in ra m số nguyên p_1, p_2, \dots, p_m . Trong đó p_i là số hiệu của cạnh thứ i đi qua.

Ví dụ:

Dữ liệu:

1
3 3
1 2
2 3
1 3

Kết quả:

YES
1 2 -3

Dữ liệu:

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

Kết quả:

YES
4 1 3 5 2 6

Giới hạn: 1 \leq n \leq 10^5, 0 \leq m \leq 2 \times 10^5