Cho đồ thị điều khiển luồng (CFG) gồm n khối cơ bản đánh số 1,…,n và m cạnh có hướng u→v. Có E biểu thức đánh số 1,…,E. Với mỗi khối B, cho trước:
Tính tập biểu thức khả dụng (available expressions) — bài toán "must" (giao các nhánh) — bằng phương trình lặp điểm bất động chuẩn: IN[B]=⋂P∈pred(B)OUT[P](IN[B]=∅ neˆˊu B khoˆng coˊ tieˆˋn toˆˊ naˋo) OUT[B]=GEN[B]∪(IN[B]∖KILL[B])
Khởi tạo OUT[B]={1,…,E} với mọi B, lặp lại cho đến khi mọi OUT[B] không còn thay đổi (thuật toán đơn điệu, luôn hội tụ về nghiệm nhỏ nhất — chính là nghiệm đúng của bài toán).
In ra n dòng, dòng thứ B là các chỉ số biểu thức thuộc OUT[B] sau khi hội tụ, theo thứ tự tăng dần, cách nhau dấu phẩy (không khoảng trắng); nếu rỗng in -.
Input:
3 2 2
1 2
2 3
1 1 0
1 2 1 1
0 0
(3 khối, 2 biểu thức, cạnh 1→2, 2→3; khối 1: GEN={1},KILL=∅; khối 2: GEN={2},KILL={1}; khối 3: GEN=∅,KILL=∅)
Output:
1
2
2
Dòng đầu: 3 số nguyên n,E,m (1≤n≤200, 1≤E≤60, 0≤m≤2000). m dòng tiếp theo, mỗi dòng "u v" là cạnh u→v (1≤u,v≤n). Tiếp theo, với mỗi khối B=1,…,n theo thứ tự: một dòng gồm số nguyên g (kích thước GEN[B]), g chỉ số biểu thức, số nguyên k (kích thước KILL[B]), rồi k chỉ số biểu thức.
In n dòng, dòng B là OUT[B] (chỉ số tăng dần, cách nhau dấu phẩy, không khoảng trắng); in - nếu OUT[B] rỗng.
Ví dụ:
Đầu vào:
3 2 2
1 2
2 3
1 1 0
1 2 1 1
0 0
Đầu ra:
1
2
2
Đầu vào:
1 1 0
1 1 0
Đầu ra:
1
Đang tải editor...