BOI 2018 - Love Polygon

Xem PDF



Dạng bài
Ngôn ngữ cho phép
Assembly, Awk, C, C#, C++, Clang, Cobol, D, Groovy, Haskell, JS, Java, Kotlin, Lua, Node JS, OCaml, ObjectiveC, PHP, Pascal, Perl, Prolog, Pypy, Pypy 3, Python, Ruby, Rust, Scala, Scratch, Swift
Điểm: 2100 (p) Thời gian: 2.0s Bộ nhớ: 512M Input: bàn phím Output: màn hình

Như chúng ta đều biết, những bộ phim truyền hình dài tập có nhiều nhân vật có thể dẫn đến những chuyện tình vô cùng rắc rối. Trong một bộ phim có \(N\) nhân vật. Mỗi nhân vật yêu đúng một nhân vật, có thể là chính mình. Hai nhân vật khác nhau được gọi là một cặp đôi khi và chỉ khi họ yêu nhau.

Một kiểu rắc rối đặc biệt được gọi là “đa giác tình yêu”. Từ ba nhân vật trở lên tạo thành một đa giác tình yêu nếu người thứ nhất yêu người thứ hai, người thứ hai yêu người thứ ba, cứ như vậy, và người cuối cùng yêu người thứ nhất.

Một cuộc khảo sát gần đây cho thấy khán giả đã chán những chuyện tình rắc rối này và muốn xem điều gì đó lãng mạn hơn. Vì vậy, người ta quyết định bắn những mũi tên tình yêu vào một số nhân vật để tất cả mọi người đều có đôi. Khi bắn một mũi tên tình yêu vào một nhân vật, bạn có thể thay đổi người mà nhân vật đó yêu thành bất kỳ nhân vật nào bạn chọn.

Cần ít nhất bao nhiêu mũi tên tình yêu để tất cả mọi người đều có đôi?

Dữ liệu vào

Dòng đầu tiên chứa số nguyên \(N\), là số nhân vật. Mỗi dòng trong \(N\) dòng tiếp theo chứa hai tên \(s\)\(t\) cách nhau bởi một dấu cách, cho biết nhân vật tên \(s\) ban đầu yêu nhân vật tên \(t\).

Dữ liệu ra

In ra một số nguyên: số mũi tên tình yêu ít nhất cần dùng để tất cả mọi người đều có đôi. Nếu không thể làm được, in ra -1.

Ràng buộc

  • \(2 \le N \le 100\,000\).
  • Tên của mỗi nhân vật dài không quá \(10\) chữ cái và chỉ gồm các chữ cái tiếng Anh viết thường.
  • Mỗi nhân vật yêu đúng một nhân vật; người đó có thể là chính mình.

Phân nhóm

  • Mỗi nhóm kiểm thử gồm một số bộ dữ liệu. Bạn chỉ nhận được điểm của một nhóm khi giải đúng tất cả các bộ dữ liệu trong nhóm đó.
  • Điểm của một lần nộp là tổng điểm các nhóm đạt được. Điểm cuối cùng là điểm cao nhất của một lần nộp.

  • Nhóm 1 (21 điểm): \(2 \le N \le 20\).

  • Nhóm 2 (25 điểm): \(2 \le N \le 100\,000\); mỗi nhân vật đều được một người nào đó yêu, có thể là chính mình.
  • Nhóm 3 (29 điểm): \(2 \le N \le 100\,000\); ban đầu không có cặp đôi nào và không có đa giác tình yêu nào.
  • Nhóm 4 (25 điểm): \(2 \le N \le 100\,000\); không có ràng buộc bổ sung.

Ví dụ

Ví dụ 1

Input
8
leonard emmy
ada emmy
isaac leonard
emmy pierre
pierre bernhard
bernhard emmy
sofia karl
karl sofia
Output
3
Giải thích

Phần trên của hình thể hiện tình trạng ban đầu: mũi tên từ \(s\) đến \(t\) cho biết \(s\) ban đầu yêu \(t\). Ba nhân vật được tô màu hồng là những người cần được bắn mũi tên tình yêu trong phương án tối ưu duy nhất. Phần dưới thể hiện tình trạng sau đó.

Ví dụ 2

Input
4
a c
b c
c d
d d
Output
3
Giải thích

Ví dụ này thỏa mãn ràng buộc của nhóm 3 và có nhiều phương án tối ưu. Một phương án là bắn mũi tên tình yêu vào a, bd, khiến họ lần lượt yêu b, ac.

Ví dụ 3

Input
3
rocky scarlet
scarlet patrick
patrick rocky
Output
-1
Giải thích

Đây là một tam giác tình yêu. Dù bắn bao nhiêu mũi tên tình yêu, vẫn luôn có một người không có đôi.

Nguồn

Baltic Olympiad in Informatics 2018, ngày thi thứ nhất.

Bình luận

Mới nhất
Tải bình luận...

Không có bình luận nào.

Kỳ thi: