Các lượt nộp
    Danh sách bài
    Trang chủ
    Báo lỗi

    solution

    Đề bài: [Trình biên dịch] Cấp phát thanh ghi bằng tô màu đồ thị tham lam

    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):

    1. Xét các đỉnh theo thứ tự bậc giảm dần; nếu hai đỉnh cùng bậc, đỉnh nào xuất hiện trước trong danh sách đỉnh của input được xét trước.
    2. Khi đến lượt một đỉnh, gán cho nó thanh ghi (đánh số từ 000) là số nhỏ nhất chưa được dùng bởi bất kỳ đỉnh kề nào đã được tô màu tính đến thời điểm đó (chỉ quan tâm đỉnh kề đã tô hay chưa, không quan tâm nó được xử lý trước hay sau đỉnh hiện tại theo thứ tự gốc trong input).

    Cho kkk là số thanh ghi vật lý sẵn có (đánh số 0,…,k−10,\dots,k-10,…,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ô):

    • Nếu tổng số màu khác nhau đã dùng ≤k\le k≤k: in OK rồi in cách gán màu cho từng biến.
    • Nếu tổng số màu đã dùng >k> k>k: in SPILL rồi in số lượng biến có màu được gán ≥k\ge k≥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,CA,B,CA,B,C (3 cạnh đôi một) với k=3k=3k=3: theo thứ tự gốc (cùng bậc 2), AAA được tô trước, nhận màu 000; BBB kề AAA(màu 0) nên nhận màu 111; CCC kề cả A,BA,BA,B nên nhận màu 222 — dùng đúng 3 màu, đủ k=3k=3k=3 thanh ghi, in OK.

    • Định dạng đầu vào:

      Dòng 1: hai số nguyên nnn và kkk (0≤n≤2000 \le n \le 2000≤n≤200, k≥1k \ge 1k≥1) cách nhau bởi khoảng trắng — số đỉnh và số thanh ghi. Dòng 2: nnn 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=0n=0n=0 dòng này để trống). Dòng 3: mmm (0≤m≤200000 \le m \le 200000≤m≤20000) — số cạnh. mmm dòng tiếp theo, mỗi dòng 2 tên biến u v (u≠vu \ne vu=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 nnn biến ở dòng 2).

    • Định dạng đầu ra:

      Nếu số màu dùng ≤k\le k≤k: dòng đầu OK, sau đó nnn 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> k>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...