Giải bóng đá

Xem dạng PDF

Gửi bài giải


Điểm: 0,20 (OI)
Giới hạn thời gian: 0.38s
Giới hạn bộ nhớ: 512M
Input: stdin
Output: stdout

Nguồn bài:
Ngô Minh Ðức / vCoder08
Dạng bài
Ngôn ngữ cho phép
C, C++, Go, Java, Kotlin, Pascal, PyPy, Python, Rust, Scratch

Một giải thi đấu bóng đá gồm ~n~ đội thi đấu vòng tròn một lượt. Các đội bóng được đánh số thứ tự từ ~1~ đến ~n~. Theo thể lệ giải đấu, nếu trận đấu diễn ra với kết quả hòa, hai đội sẽ thi đấu luân lưu cho đến khi phân định thắng thua (nghĩa là các trận đấu đều được phân định thắng thua).

Hỏi có tồn tại một cách sắp xếp các đội theo thứ tự sao cho trong thứ tự đó, mỗi đội đều thắng trận đấu với đội liền sau mình? Trong trường hợp tồn tại, hãy xác định một cách sắp xếp như vậy.

Input

  • Dòng đầu tiên chứa số nguyên ~n~ ~(1 \leq n \leq 1000)~ --- số đội bóng tham dự giải đấu.

  • Dòng thứ ~i~ trong số ~n~ dòng tiếp theo chứa ~j~ kí tự '0' hoặc '1', kí tự thứ ~j~ thế hiện giá trị ~a_{ij}~:

    • ~a_{ii}~ = 0 với mọi ~i~.
    • ~a_{ij}~ = 1 nếu và chỉ nếu đội ~i~ thắng đội ~j~. Dữ liệu vào luôn thỏa mãn ~a_{ij}~ +~a_{ji}~ = 1 với ~i~ khác ~j~.

Chú ý: Có ~30\%~ số test có ~n \leq 9~.

Output

In ra ~-1~ nếu không tồn tại cách sắp xếp thỏa mãn yêu cầu. Trong trường hợp tồn tại, in ra ~n~ số nguyên là chỉ số của các đội bóng trong cách sắp xếp tìm được.

Sample Input

3
010
000
110

Sample Output

3 1 2

Bình luận

Hãy đọc nội quy trước khi bình luận.



  • 1
    thanhlong2188  đã bình luận lúc 25, Tháng 2, 2024, 13:28

    sắp xếp topo:))


  • 2
    xuanduy1508  đã bình luận lúc 1, Tháng 3, 2023, 10:54

    đề không có trường hợp -1 đâu anh em để bị lừa


    • 1
      minhducle31o  đã bình luận lúc 19, Tháng 4, 2023, 9:11

      phải tự suy ra từ tính chất bạn ạ


      • -3
        z  đã bình luận lúc 19, Tháng 4, 2023, 15:50

        tính chất gì thế bạn ?


        • 5
          hxano  đã bình luận lúc 21, Tháng 4, 2023, 18:20

          Ta có thể coi mỗi một đội là một nút, và mỗi trận đấu là một cạnh chỉ từ nút đội thua đến nút đội thắng đến nút đội thua. Bài toán của chúng ta được quy về việc chứng minh rằng một đồ thị gồm ~n~ đỉnh và ~n(n-1)/2~ cạnh luôn có một đường đi Hamilton.


          Gọi ~P=~{~u1, u2, u3, ..., u(n-1), un~}~~ là đường đi đi qua nhiều đỉnh nhất trên đồ thị. Giả sử tồn tại một đỉnh ~u0~ thuộc đồ thị nhưng không thuộc ~P~.


          Xét cạnh ~(u1, u0)~. Ta thấy được bắt buộc cạnh này phải đi từ ~u1~ đến ~u0~. Vì nếu cạnh đi từ ~u0~ đến ~u1~ thì sẽ mâu thuẫn với giả thiết ban đầu rằng ~P~ là đường đi qua nhiều đỉnh nhất trên đồ thị (|{~u0~} hợp ~P~|>|~P~|).


          Tương tự, cạnh ~(un, u0)~ sẽ đi từ ~u0~ đến ~un~.


          Vì ~u0~ sẽ nối với tất cả các đỉnh còn lại (đi vào hoặc đi ra), nên sẽ tồn tại ít nhất một giá trị ~i~ ~(1≤i<n)~ sao cho ~(ui, u0)~ đi từ ~ui~ đến ~u0~ và ~(u(i+1), u0)~ đi từ ~u0~ đến ~u(i+1)~. Đến đây, ta lại tìm thấy một đường đi đi qua nhiều đỉnh hơn ~P~ ~(u1→u2→...→ui→u0→u(i+1)→...→u(n-1)→un)~.


          Do đó, đường đi đi qua nhiều đỉnh nhất của đồ thị như đề bài sẽ luôn là đường đi Hamilton. Mà vì ta luôn tìm được đường đi đi qua nhiều đỉnh nhất của một đồ thị có hướng nên sẽ luôn tìm được đường đi Hamilton.