Cấp phát thanh ghi (register allocation) thường được mô hình hoá bằng bài toán tô màu đồ thị giao nhau (interference graph): mỗi biến tạm là một đỉnh; hai đỉnh có cạnh nối nếu hai biến đó "sống" cùng lúc tại một điểm nào đó trong chương trình, nên không được cấp cùng một thanh ghi. Bài này cho trực tiếp đồ thị giao nhau (không cần tính sống) và yêu cầu tô màu bằng thuật toán tham lam với thứ tự xử lý đỉnh xác định sau (để kết quả là duy nhất):
Cho k là số thanh ghi vật lý sẵn có (đánh số 0,…,k−1). Sau khi tô màu toàn bộ đồ thị theo thuật toán trên (quá trình tô luôn thành công, không giới hạn số màu khi đang tô):
OK rồi in cách gán màu cho từng biến.SPILL rồi in số lượng biến có màu được gán ≥k — đây chính là các biến phải "tràn" ra bộ nhớ (spill) vì không đủ thanh ghi vật lý.Ví dụ: đồ thị tam giác đầy đủ A,B,C (3 cạnh đôi một) với k=3: theo thứ tự gốc (cùng bậc 2), A được tô trước, nhận màu 0; B kề A(màu 0) nên nhận màu 1; C kề cả A,B nên nhận màu 2 — dùng đúng 3 màu, đủ k=3 thanh ghi, in OK.
Dòng 1: hai số nguyên n và k (0≤n≤200, k≥1) cách nhau bởi khoảng trắng — số đỉnh và số thanh ghi. Dòng 2: n tên biến (chuỗi không chứa khoảng trắng) cách nhau bởi khoảng trắng, theo đúng thứ tự xuất hiện ban đầu (nếu n=0 dòng này để trống). Dòng 3: m (0≤m≤20000) — số cạnh. m dòng tiếp theo, mỗi dòng 2 tên biến u v (u=v) biểu diễn một cạnh vô hướng (đảm bảo không có cạnh lặp lại, đồ thị không có khuyên, tên biến đều nằm trong danh sách n biến ở dòng 2).
Nếu số màu dùng ≤k: dòng đầu OK, sau đó n dòng, mỗi dòng tên_biến màu theo đúng thứ tự xuất hiện ban đầu của biến trong input (không phải thứ tự xử lý tô màu). Nếu số màu dùng >k: dòng đầu SPILL, dòng thứ hai là một số nguyên — số biến cần spill.
Ví dụ:
Đầu vào:
3 3
A B C
3
A B
B C
A C
Đầu ra:
OK
A 0
B 1
C 2
Đầu vào:
0 3
0
Đầu ra:
OK
Đang tải editor...