Bộ đồng xử lý

Đề bài

Mô tả

Một chương trình gồm N tác vụ được đánh số từ 0 đến N1. Giữa các tác vụ có M quan hệ phụ thuộc, tạo thành một đồ thị có hướng không chu trình: nếu tác vụ T1 phụ thuộc tác vụ T2 thì T2 phải hoàn thành trước khi T1 được thực thi.

Mỗi tác vụ chỉ chạy được trên đúng một trong hai thiết bị: bộ xử lý chính hoặc bộ đồng xử lý. Giá trị Ei cho biết tác vụ i thuộc loại nào: Ei=0 nghĩa là tác vụ chỉ chạy trên bộ xử lý chính, Ei=1 nghĩa là tác vụ chỉ chạy trên bộ đồng xử lý.

Bộ xử lý chính điều khiển toàn bộ chương trình và tự động nhận kết quả từ bộ đồng xử lý. Mỗi lần gọi bộ đồng xử lý, ta gửi cho nó một tập tác vụ (tất cả đều thuộc loại Ei=1). Tập này hợp lệ khi với mọi tác vụ trong tập, mọi tác vụ mà nó phụ thuộc đều đã hoàn thành từ trước hoặc cũng nằm trong chính tập đó.

Hãy tìm số lần gọi bộ đồng xử lý ít nhất để chạy xong toàn bộ chương trình.

Dữ liệu vào

  • Dòng đầu chứa hai số nguyên NM: số tác vụ và số quan hệ phụ thuộc.
  • Dòng thứ hai chứa N số nguyên E0,E1,,EN1, mỗi số bằng 0 hoặc 1.
  • M dòng tiếp theo, mỗi dòng chứa hai số nguyên T1T2 (T1T2), nghĩa là tác vụ T1 phụ thuộc tác vụ T2.

Các cặp (T1,T2) đôi một phân biệt và đồ thị phụ thuộc đảm bảo không có chu trình.

Dữ liệu ra

In ra một số nguyên duy nhất: số lần gọi bộ đồng xử lý ít nhất.

Ràng buộc

  • 1N105
  • 0M105
  • 0T1,T2N1
  • Ei{0,1}

Ví dụ

Input Output Giải thích
4 3
1 1 1 0
0 1
0 2
3 0
1 Các tác vụ 0,1,2 chạy trên bộ đồng xử lý. Tác vụ 12 không phụ thuộc gì, tác vụ 0 phụ thuộc cả 12, nên cả ba được gửi trong cùng một lần gọi. Sau đó tác vụ 3 chạy trên bộ xử lý chính.
4 3
0 1 0 1
0 1
1 2
2 3
2 Đồ thị là một dây chuyền, thứ tự thực thi bắt buộc là 3210. Gọi bộ đồng xử lý cho tác vụ 3, chạy tác vụ 2 trên bộ xử lý chính, gọi bộ đồng xử lý lần nữa cho tác vụ 1, cuối cùng chạy tác vụ 0.

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.400 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.2 gforth 0.7.3 gfortran 12.2.0 go 1.27.0 groovyc 5.1.1 javac 25.0.4 node 26.8.1 julia 1.12.7 kotlinc 2.4.10 lean 4.33.1 sbcl 2.2.9 lua 5.4.9 nim 2.2.10 fpc 3.2.2 fpc-themis 3.2.2 perl 5.36.0 php 8.5.10 pike 8.0 swipl 9.0.4 pypy3 7.3.23 python3 3.14.7 racket 8.7 ruby 4.0.6 rustc 1.98.0 csc 5.3.0 ctoj-scratch 0.0.1 sed 4.9 swiftc 6.3.3 tclsh 8.6 bun 1.4.0 deno 2.9.6 v 0.5.2 zig 0.16.0