#1580. PVIEC - Phân công công việc

Bộ nhớ: 256 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 công việc và n người làm (m,n≤500) . Ta biết các cặp nguời, việc i,j mà người i có thể làm đuợc việc j . Mỗi người làm một công việc trong 1 đơn vị thời gian, thời điểm bắt đầu thưc hiện công việc là 0 . Một người có thể làm nhiều việc nhưng một việc chỉ có thể do 1 người làm. Hãy tìm cách bố trí thực hiện tất cả các công việc sao cho số công việc của người làm nhiều việc nhất là nhỏ nhất, tức cũng chính là thời điểm hoàn thành tất cả các công việc.

Dữ liệu:

  • Dòng đầu chứa hai số nguyên dương m n ;
  • n dòng tiếp theo, dòng i chứa danh sách các công việc mà thợ i có thể thực hiện, có thêm một ký hiệu kết thúc là số 0 .

Kết quả:

  • Dòng đầu ghi từ YES hay NO tuỳ theo có tồn tại cách phân công để thực hiện tất cả các công việc hay không;
  • Nếu dòng đầu ghi từ YES thì:
    • Dòng hai ghi thời gian nhanh nhất có thể để hoàn thành các công việc;
    • n dòng tiếp theo, dòng i ghi danh sách các công việc được phân cho thợ i , ghi thêm một ký hiệu kết thúc là số 0 .

Ví dụ:

Dữ liệu:

2 3
1 2 0
1 0
2 0

Kết quả:

YES
1
2 0
1 0
0