Sunteți pe pagina 1din 9

Negrueri Cosmin

Problema satisfabilitii formulelor logice de ordinul doi

Problema satisfabiltiii notat prescurtat cu SAT cere determinarea existenei pentru o


formul boolean phi a unei artibuiri satisfiabile. O formul boolean phi este compus
din variabile logice (x1, x2, ) operatori logici ( ^ i, V sau, ~ nu, -> implicaie i <->
echivalen), i paranteze. O atribuire de valori booleene pentru variabilele acestei
expresii se numete atribuire satisfiabil dac evaluarea expresiei dup atribuirea
valorilor d ca rezultat valoarea de adevr adevrat. De acum ncolo vom folosi pentru
simplitate valorile 1 i 0 n loc de adevrat i fals.
Un exemplu de formul ar fi
= ((x1 x2) (( x1 x3) x4)) x2
aceasta are atribuirea satisfiabil x1 = 0, x2 = 0, x3 = 1, x4 = 1 pentru c
= ((0 0) (( 0 1) 1)) 0 = (1 (1 1)) 1
= (1 0) 1 = 1
Orice formul boolean poate fi transformat n dou forme. Forma normal conjunctiv
n care expresia este exprimat ca o conjuncie de propoziii, iar fiecare propoziie este
format din o disjuncie de literali, un literal este o variabil care poate fi sau nu fi negat.
Un exemplu de expresie n forma normal conjunctiv ar fi (x1 x1 x2) (x3 x2
x4) ( x1 x3 x4) ea are pe (x1 x1 x2) ca prim propoziie, iar aceast
propoziie are literalii x1, x1, x2. Forma normal disjunctiv este format ca o
diskuncie de propoziii, fiecare dintre aceste propoziii fiind o conjuncie de literali. Un
exemplu de o asemenea formul ar fi urmroarea (x 1 x 2 x 3) (x 1 x 2 x 3)
(x 1 x2 x 3) ( x 1 x 2 x 2).
Problema SAT este NP-complet, de fapt este prima problem NP-complet gsit.
Stephen Cook a demonstrat NP-completitudinea ei n 1971. Pe vremea aceea nu se tia
nici mcar c problemene NP-complete exist. Aceast problem rmne NP-complet
chiar dac restricionm expresiile la unele care n forma normal conjunctiv au doar trei
literali. Problema satisfabilitii pentru asemenea expresii se numete 3SAT, i multe
probleme poti fi demonstrate a fi NP-complete prin reducerea la aceast problem . Din
fericire problema 2SAT adic cea pentru care n fiecare propoziie exist doar doi literali
se poate rezolva eficient. Restul articolului va prezenta trei metode de rezolvare a
problemei 2SAT i cteva aplicaii ale acesteia la concursuri de programare.
Un exemplu de problem 2SAT ar fi satisfabilitatea formulei urmtoare:
(x1 x2) ( x1 x3) (x1 x2) (x4 x3) (x4 x1)
Aceast expresie este satisfcut de valorile x1 = 1,x2 = 0,x3 = 0,x4 = 1.
Pentru a satisface ntreaga expresie trebuie ca n fiecare propozoie cel puin unul din cei
doi literali trebuie s aib valoarea de adevr 1.

O prim metod de rezolvare ar fi s ncercm toate cele 2^n posibiliti de atribuire


posibil, aceast metod are ordinul de complexitate O(Mx2^N) i este eficient doar
pentru instane mici ale problemei.
Urmtoarea soluie pare trivial, dar gsirea acestui algoritm i realizarea faptului c el
rezolv correct problema este mai grea dect impresia lsat dup citirea ei.
Lum o propoziie oarecare cu dou variabile p i q, lum una dintre ele de exemplu p,
dac literalul n care apare p este negat atunci i atribuim valoarea 1, pentru ca propoziia
respectiv s aib 1 valoarea de adevr atunci valoarea lui q este fixat. Fixnd i
valoarea lui q, probabil i alte propoziii ce conin literalul q vor avea cellalt literal fixat.
Propagm astfel o serie de schimbri. Dup ce toate schimbrile forate au fost fcute
propoziiile rezultate vor fi de urmtoarele tipuri a b, 1 0, 1 1, 1 b. Propoziii
de tip 0 b nu pot aprea pentru c toate schimbrile forate au fost deja propagate.
Dac apare o propoziie de genul 0 0 atunci alegerea fcut pentru valoarea lui p este
greit. Vom ncerca i alegerea opus. Dac ambele duc la o propoziie de tip 0 0
atunci expresia nu poate fi satisfcut. Propoziiile de forma 1 0, 1 1, 1 b pot fi
ignorate. n acest fel am eliminat cel puin o variabil i o propoziie din expresie. Dac
expresia iniial era satisfiabil, atunci i expresia din care s-au eliminate cteva
propoziii a rmas satisfiabil. Continund pe aceast idee obinem un algoritm de
complexitate O(NxM), pentru c la fiecare atribuire de valoare pentru o variabil
parcurgem irul de propoziii o dat.
S vedem cum merge algoritmul pentru expresia:
(x1 x2) ( x1 x3) (x1 x2) (x4 x3) (x4 x1)
Lum propoziia (x1 x2) i lum valoarea x2 = 1, astfel obinem expresia (x1 0) (
x1 x3) (x1 1) (x4 x3) (x4 x1) n propozia (x1 0) variabila x1
trebuie s fie 1 acum expresia devine (0 x3) (x4 x3) (x4 0), din propoziia
(0 x3) tragem concluzia c x3 trebuie s fie 0 i din propoziia (x4 0) avem c x4
trebuie s fie 1, astfel obinem atribuirea satisfiabil x1 = 1,x2 = 0,x3 = 0,x4 = 1.

O alt soluie se elegant se bazeaz pe o metod randomizat: pornim mai nti cu o


atribuire de valori booleene oarecare variabilelor, apoi gsim o propoziie cu valoarea de
adevr 0, schimbarea valorii de adevar a oricrei dintre cele dou variabile prezente n
propoziie va face ca acea propoziie s aib noua valoare de adevr 1. Ct expresia nu
este satisfcut repetm acest procedeu de schimbare a valorii unei variabile dintr-o
propoziie nesatisfcut.
De ce ar merge acest algoritm? S presupunem c exist o soluie a problemei, o notm
cu S, iar cu X notm irul valorilor curente ale variabilelor. Ne uitm la fiecare pas al
algoritmului la numrul de variabile care au valori diferite n soluie fa de cele din X
(aceast numr de diferene ntre elementele de acelai index pentru dou iruri se mai
numete i distan Hamming ntre iruri). Fie aceast valoare la pasul current K. Noi am
vrea ca s avem K = 0. Cum va evolua K pe parcursul algoritmului? La un moment dat
noi schimbm valoarea unei variabile luate aleator din o propoziie nesatisfcut. Pentru
c n S propoziia este satisfcut, nseamn c cel puin una dintre cele dou variabile ale
propoziiei are valori diferite n X fa de S. Astfel operaia fcut de noi are probabilitate
de cel puin 0.5 s ne aduc mai aproape de soluie. Vom nota cu T(i) numrul probabil de
pai n care un ir X aflat la distana Hamming egal cu i fa de S, va fi transformat n S.
Evident T(0) = 0.
T(i) <= (T(i + 1) + T(i 1)) / 2 + 1 pentru 0 < i < N (N e numrul de variabile booleene
ale expresiei)
Se pune semnul de inegalitate pentru c ambele variabile pot avea valori diferite fa de
cele din soluie, deci schimbarea valorii oricreia ar putea s ne aduc mai aproape de
soluie.
T(N) = T(N 1) + 1 pentru c dac toate variabilele difer de soluie, orice schimbare ne
aduce mai aproape de soluie.
Ne intereseaz numai limitele superioare deci folosim doar egaliti n loc de inegaliti:
X(0) = 0, X(i) = (X(i+1) + X(i 1))/2 + 1, X(N) = X(N 1) + 1
Dac adunm toate ecuaiile obinem:
X(0) + X(1) + + X(N) = (X(0) + X(1) + 2X(1) + + 2X(N-2) + X(N-1) + X(N)) / 2 +
N + X(N 1)
De aici avem c (X(1) + X(N) X(N 1)) / 2 = N, din X(N) = X(N-1) + 1 avem X(1) =
2N 1. Mai departe avem c X(2) = 4n -4 X(i) = 2iN i^2 de unde cnd i = N avem
c X(N) = N^2.

Astfel numrul mediu de pai ai algoritmului este N^2, astfel dac aplicm algoritmul n
mod aleator de mai multe ori avem o probabilitate foarte mare s ajungem la rezultat.

O a treia soluie se bazeaz pe relaia de implicaie. Relaia -> are urmtoarea tabel de
adevr
A B A->B
0 0 1
0 1 1
1 0 0
1 1 1
(relaia de implicaie are semnificaia dac A este adevrat atunci i B este adevrat)
Scriem tabelul expresiei ~A V B i observm c acesta este egal cu cel al relaiei de
implicaie.
A B ~A V B
0 0 1
0 1 1 Fiecare clauz A V B poate fi scris ca dou
1 0 0 implicaii ~A->B i ~B->A. Realizm un graf al
1 1 1 implicaiilor, astfel nodurile grafurilor vor fi
variabilele A, B ... i negaiile lor ~A, ~B iar
muchiile acestui graf vor fi implicaiile echivalente cu propoziiile din expresie. Deci
dac expresia are M propoziii graful va avea 2M muchii.
Astfel expresiei ( A B) (B C) (B C) ( B D) (C D) i
corespunde graful:
Dac avem AB o muchie n graful nostru, atunci dac literalul A este adevrat atunci i
literalul B trebuie s fie adevrat pentru ca propoziia reprezentat de mucie s fie
satisfcut. Putem demonstra prin inducie c dac exist un drum n graf de la literalul A
la literalul B, atunci dac A este adevrat i B trebuie s fie adevrat. Dacp exist un
drum de la un literal X la X atunci nu va exista soluie pentru c nu putem seta n
acelai timp o variabil i valoarea ei negat la valoarea adevrat. De aici rezult c dac
n graful asociat expresiei exist o variabil X n aceiai component tare conex cu X
atunci instana problemei satisfiabilitii nu poate fi satisfcut.
Dac nu exist o asemenea variabil, vom vedea n continuare cum putem rezolva
problema. Mai nti facem observaia c dac n graf exist muchia AB atunci exist i
muchia B A. Astfel dac exist un drum de la A la B n graf, aplicnd proprietatea
menionat pentru fiecare muchie a drumului, vom gsi un drum de la B la A.
Evident avem i invers dac exist drum de la B la A vom avea un drum de la nodul A
la nodul B. Astfel dac avem c A i B sunt n aceeai component tare conex atunci i
nodurile A i B sunt n aceeai component conex. Deci dac nu exist doi literali X
i X n aceeai component tare conex, putem s mprim graful n componente tari
conexe i s mperechem componentele cte dou astfel ca n fiecare pereche s apar o
component U cu nite literali i alt component U cu aceiai literali negai.
Pentru a gsi o soluie vom determina mai nti componentele tari conexe ale grafului.
Apoi putem contracta fiecare component ntr-un nod. Graful obinut va fi acciclic.
Alegem un nod u n care nu intr nici o muchie (un asemenea nod trebuie s existe pentru
a nu exista cicluri), din considerente de simetrie, din nodul lui pereche u nu va iei nici
o muchie. Literalilor componentei U putem s le dm valoarea de adevr 0, iar literalilor
din componenta pereche U putem s le dm valoarea de adevr 1. Aceast alegere nu
impune resrictii asupra celorlalti literali i elimin cteva variabile din problem.
Repetarea recursiv a acestui pas pe graful rmas va duce la rezolvarea problemei.
Determinarea componentelor tari conexe se poate face n complexitatea O(N + M),
pentru a vedea acest algoritm puteti consulta seciunea 23.5 a [1]. Iar eliminarea
nodurilor de care vorbeam mai sus se poate face n O(N + M) folosind de exemplu o
sortare topologic.
S vedem cum merge algoritmul nostru pe exemplul de mai sus.
Componentele tari conexe sunt urmtoarele {A}, { A}, {B, C, D} i { B, C, D}.
n nodul asociat componentei {A} nu intr nici o muchie astfel putem s i dm lui A
valoarea 0, iar n nodul asociat componentei { B, C, D} nu intr nici o muchie deci
putem s dm lui B valoarea 1, lui C valoarea 0 i lui D valoarea 1. Aceast atribuire este
satisfiabil dup cum vedem n continuare:
( A B) (B C) (B C) ( B D) (C D) = ( 0 1) (1
1) (1 1) ( 1 0) (1 0) = 1 1 1 1 1 = 1
Aplicaii:

Problema 1: Party (preOni 2003-2004 infoarena)


George vrea s i organizeze majoratul, i vrea ca petrecerea s fie de neuitat, mncarea,
butura, locaia i sonorizarea sunt deja asigurate, mai ramane problema chemrii
prietenilor. El i cu prietenul lui cel mai bun Lucian au preferinte diferite i pentru a nu se
certa au pus la punct o lista de cerine care vor trebui s fie ndeplinite astfel nct cheful
s se desfoare n cele mai bune conditii! Pentru uurin, prietenii lui George vor fi
indentificai prin numere ntregi de la 1 la N (1 N 100) i cerinele n numr de M (1
M 1.000) vor fi de tipurile 0, 1, 2 sau 3.
O cerin de genul x y 0 are semnificaia ca x sau y trebuie sa participle la petrecere ; x y
1 are semnificaia c dac x particip nu exist nici o restricie pentru y, dar dac x nu
particip atunci nici y nu participa ; x y 2 are semnificatia simetric cu cerina 1 ; iar
cerinta x y 3 are semnificatia ca cel puin unul dintre x si y nu particip la petrecere.
Scriei un program care s-i ajute pe cei doi s determine care persoane vor fi invitate la
petrecere ; se garanteaz c va fi posibil ntotdeauna organizarea unei petreceri !
Rezolvare:
Aceast problem este inspirit din o problem de la CEOI 2002 i este evident c ne cere
s determinm o atribuire satisfiabil pentru o formul logic format ca conjuncie ntre
cerinele care se transform astfel:
O cerin de tip 0 corespunde propoziiei x y, una de tip 1 corespunde propoziiei x
y, una de tip 2 corespunde propoziiei x y, iar una de tip 3 corespunde propoziiei
x y.
Una din primele dou rezolvri ar fi putut soluion aceast problem, dar problema de la
CEOI avea limite mai mari i pentru rezolvarea ei ar fi trebuit un algoritm de
complexitate O(N + M).

Problema 2: cigraf (Mugurel Ionu Andreica)


Se d un graf neorientat cu N (1 <= N <= 1000) noduri i M (0 <= M <= N*(N-
1)/2)muchii. Se dorete mprirea nodurilor acestui graf n 2 mulimi, C i I, avnd
urmtoarele proprieti: fiecare nod face parte din exact una din cele 2 mulimi, exist
muchie ntre oricare 2 noduri din mulimea C, nu exist vreo muchie ntre 2 noduri din
mulimea I. Este posibil ca una dintre cele 2 mulimi s fie vid. Soluia nu este
neaparat unic. Numele celor 2 mulimi provin de la clic i mulime independent.
De exemplu pentru graful de 6 noduri ce are muchiile {1, 4}, {4, 6}, {6, 1}, {2, 4}, {2,
6}, {3, 4}, {1, 3} o mprire posibil ar fi C = {1, 4, 6}, I = {2, 3, 5}.
Rezolvare:
Dac ntre dou noduri exist muchie atunci nu pot fi amndou n mulimea I, iar dac
ntre dou noduri nu exist muchie nu pot fi amndou n mulimea C.
Transformm aceast problem ntr-o instan de 2SAT astfel:
Faptul c nodul x aparine mulimii C l reprezentm dndui lui x valoarea 1, iar
apartenena mulimii I se codific prin valoarea 0. Acum existena unei muchii (x, y)
corespunde expresiei x y, astfel cel puin unul din nodurile x i y nu va fi n mulimea I.
Dac nu exist muchia (x, y) putem scrie x y, aceast expresie va fi adevrat dac
cel puin un nod din cele dou nu va fi n mulimea C.
Aceast soluie este liniar ca i complexitate n numrul de elemente citite la intrare.
Problema 3: Peace Commission (Polish Olympiad in Informatics 2001)
Comisia Public a Pcii trebuie s fie compus n parlamentul Republicii Democrate a
rii Byteland dup regulile impuse de Legea Foarte Important. Din pcate unul dintre
obstacole este acela c unii deputai nu se neleg cu ceilali. Comisia trebuie realizat
astfel ca urmtoarele condiii s fie ndeplinite: fiecare partid trebuie s aib exact un
reprezentant n comisie; dac doi deputai nu se neleg, ei nu pot fi ambii membrii ai
comisiei.
Fiecare partid are exact doi deputai n parlament. Toi numrai de la 1 pn la 2n
(1<=n<=8000). Deputaii cu numerele 2i-1 i 2i aparin celui de al i-lea partid.Se vor da
m (0<=m<=20000) perechi de deputai (a, b) care nu se neleg.
Se cere realizarea unei comisii dac acest lucru este posibil.
Un exemplu ar fi pentru trei partide i perechile (1, 3) i (2, 4) care nu se neleg putem
realiza comisia alctuit din membrii {1, 4, 5}.
Rezolvare:
Fiecrui partid i vom asocia o variabil, variabila va lua valoarea 1 dac membrul 2i - 1
al partidului va aparine comisiei i valoarea 0 dac membrul 2i va aparine comisiei.
Pentru ca din partidul x s existe exact un membru n expresie introducem Ax Ax.
Putem exprima c doi membrii ai parlamentului (2i, 2j) nu se neleg prin expresia logic
Ai Aj astfel nu pot ambele variabile Ai i Aj s aib n acelai timp valoarea 1
adic 2i i 2j nu pot face parte n acelai timp din comisie, dac cei doi membrii sunt (2i -
1, 2j - 1) atunci putem codifica prin expresia Ai Aj astfel Ai i Aj nu pot avea n acelai
timp valoarea 0, iar dac membrii sunt (2i , 2j - 1) se poate scrie ca Ai Aj, astfel Ai
nu poate avea valoarea 1 cnd Aj are valoarea 0.
Exemplu din problem poate fi scris ca expresia logic n modul urmtor:
A1 A1 A2 A2 A3 A3 (A1 A2) ( A1 A2)
Din nou vom putea folosi cel de-al treilea algoritm explicat pentru a obine o rezolvare de
complexitate O(N + M).

Problema 4: Excursion (Baltic Olympiad in Informatics practice task 2001)


Un grup de turiti are ocazia s viziteze mai multe orae. Fiecare turist spune dou
dorine ale sale despre ce ora ar vrea sau nu ar vrea s viziteze. O dorin a turistului va
spune despre exact un ora dac vrea sau nu vrea s l viziteze. Este posibil ca ambele
dorine ale unui turist s exprime acelai lucru sau s exprime lucruri opuse (de exemplu
Vreau s vizitez oraul A! i Nu vreau s vizitez oraul A). Va trebui s determinai dup
citirea cerinelor celor n turiti despre m orae dac exist o mulime a oraelor pentru
care cel puin o dorin a fiecrui turist este ndeplinit ( 1<=n<=20 000, 1<=m<=8 000
). De exemplu dac avem trei turiti, patru orae i primul turist are dorinele de a vizita
oraul nti i de a nu vizita oraul doi, al doilea turist are dorinele de a vizita oraul doi
i de a vizita oraul patru, iar al treilea turist are dorinele de a vizita oraul trei i de a
vizita oraul unu. O soluie pentru acest exemplu ar fi vizitarea tuturor oraelor.
Rezolvare:
Este evident c i aceast problem se poate uor transforma ntr-o instan de 2SAT.
Fiecare turist ne d prin dorinele sale o expresie literal cu doi literali. Vizitarea sau
nevizitarea oraului de index i va fi reprezentat prin variabila boolean Ai. Exemplu din
problem poate fi transformat astfel: (A1 A2) (A2 A4) (A3 A1).

Problema 5: Orpath (olimpiad Rusia)


ntr-o ar pacifist, exist N orae i K autobuze (1 <= N, K <= 100). La orele
aglomerate ale zilei, nu trebuie s existe dou autobuze care merg n acelai timp n
sensuri opuse. Traseul fiecrui autobuz este un ciclu, spunem c el merge n sens pozitiv
dac va parcurge oraele n ordinea 1 2 3 4 1 2 3 4 1 2 ... sau n sens negativ dac le
parcurge n ordinea 1 4 3 2 1 4 3 2 1 4 ... Gsii o posibilitate de atribuire a sensului
fiecrui autobuz astfel ca accidentele de trafic s fie evitate (nu vor exista dou autobuze
care s se ntlneasc i s aib sensuri de mers opuse). Pentru fiecare autobus se vor tii
oraele de pe ruta lui, i pentru fiecare dou orae vecine pe rut se va tii timpul necesar
autobuzului pentru a ajunge dintr-un ora n altul. De exemplu pentru patru orae unde
oricare dou sunt la timp de mers egal cu 10, i pentru dou autobuze cu rutele 1 2 4 i 3
4 2, o soluie ar fi ca primul autobuz s mearg n sens pozitiv iar cellalt n sens negativ.
Rezolvare:
Pentru orice dou autobuze vom gsi care sunt sensurile de mers pentru ele astfel ca cele
dou autobuze s nu se ntlneasc i s provoace un accident. Pentru un sens fixat putem
afla pentru un autobus pe ce interval de timp va fi pe o anumit strad. El va fi n general
pe o strad (i, j) pe un interval de tipul [t1 + k*T t2 + k*T] unde t1 este timpul din
prima rut parcurs pentru a ajunge la i, t2 timpul pentru a ajunge la j iar T este durata
total a unei rute. Acum pentru a determina dac dou autobuse se vor ntlni pe o rut (i,
j) trebuie ca ele s se deplaseze n sensuri opuse pe aceast rut, iar intervalele lot [t1 +
k*T1 .. t2 + k*T1] se intersecteaz cu intervalele [tt1 + p*T2 .. tt2 + p*T2]. Este clar
acum c putem transforma problema ntr-o instan de 2SAT prin maparea autobuselor n
variabile logice, a sensurilor de mers n valorile adevrat i fals, iar pentru orice pereche
de autobuze s fie o propoziie logic ce ia valoarea adevrat doar dac sensurile de mers
determinate de variabilele logice asociate autobuzelor sunt compatibile. Mai trebuie
determinat ntr-un mod eficient dac dou clase de intervale de timp se intersecteaz,
aceasta rmne ca tem cititorului.

Problema 6: Aladdin (Bursele Agora 2005/2006 Runda 1)


Aladdin, asa cum tiai, este un mare magnat n afacerea de comercializare a covoarelor
magice. Acesta dorete s o cucereasc pe prinesa Iasmina, iar aceasta, pentru a-i testa
inteligena l roag s i fac un covor dreptunghiular mprit n ptrele, asemnator
unei table de ah cu N linii i M coloane (1 <= N, M <= 1000). Fiecare ptrel de pe
covor trebuie colorat cu alb sau cu negru. Pentru fiecare ptrat caree conine patru
ptrele Iasmina pune condiia s aib un numr fixat de ptrele colorate cu negru.
Ajutai-l pe Aladdin s realizeze un covor care satisface condiiile impuse de prinesa
Iasmina!
De exemplu pentru o cerin de forma:
323
233
121
una din soluii este:
1101
1011
0110
0000
Rezolvare:
Fie A o matrice soluie a problemei noastre, vom numerota rndurile matricii de la 0 la N-
1 i coloanele de la 0 la M-1. Matricea de intrare S reprezint de fapt sumele din fiecare
ptrat de cte 2x2 elemente. Facem observaia c dac tim ntr-un ptrat de 2x2 valorile
pentru trei dintre celule, atunci valoarea din a patra celul este unic determinat pentru c
tim suma elementelor din ptrat.
Vedem astfel c dac tim valorile elementelor din prima linie a matricii A i din prima
coloan, restul valorilor sunt unic determinate.
Pentru a rezolva problema vom presupune A[0][0] cunoscut (de fapt mai nti vom
rezolva problema presupunnd c A[0][0] = 1, iar dac nu obinem nici o soluie vom
ncerca cu A[0][0] = 0). Vom nota celulele A[0][1], A[0][2], A[0][M 1] cu x1, x2, ..
xM-1 iar celulele A[1][0], A[2][0], A[N - 1][0] cu y1, y2, yM-1.

A[0][0] X1 x2 ... xN-1


y1
y2
...

yN-1

Acum pentru fiecare celul putem demonstra prin inducie c A[i][j] = (-1)^i xj + (-1)^j yi
+ b[i][j]. Unde b[i][j] sunt nite constante ce sunt calculate n funcie de matricea primit
la intrare.
Este uor de observat c dac A[i-1][j] = (-1)^(i-1) xj + (-1)^j yi-1 + b[i-1][j], A[i-1][j-1]
= (-1)^(i-1) xj-1 + (-1)^(j-1) yi-1 + b[i-1][j-1], A[i][j-1] = (-1)^i xj-1 + (-1)^(j-1) yi + b[i]
[j-1] atunci A[i][j] = S[i-1][j-1] A[i-1][j] A[i][j-1] A[i-1][j-1] = S[i-1][j-1] ((-
1)^(i-1) xj + (-1)^j yi-1 + b[i-1][j]) ((-1)^(i-1) xj-1 + (-1)^(j-1) yi-1 + b[i-1][j-1]) ((-
1)^i xj-1 + (-1)^(j-1) yi-1 + b[i][j-1]) = (-1)^i xj - (-1)^j yi-1 + (-1)^i xj-1 + (-1)^j yi-1 - (-
1)^i xj-1 + (-1)^j yi + S[i-1][j-1] b[i-1][j] b[i][j-1] b[i- 1][j-1] = (-1)^i xj + (-1)^j yi
+ b[i][j]. De aici tragem concluzia c b[i][j] = S[i-1][j-1] b[i-1][j] b[i][j-1] b[i- 1][j-
1] (*).
Avem un sistem format din inecuaiile:
0 <= xj <= 1
0 <= yi <= 1
-b[i][j] <= (-1)^i xj + (-1)^j yi <= 1 b[i][j]
Este uor acum s transformm acest sistem ntr-o formul boolean n form normal
conjunctiv n care fiecare expresie are cel mult doi literali. Fiecare relatie o putem
nmulti sau nu cu -1 astfel ca parile constante ale relatiei s fie pozitive. Observm c |
b[i][j]| <= 2 altfel nu avem soluie. Dac |b[i][j]| = 2 atunci ambele variabile au valori
fixe, iar dac |b[i][j]| = 1 sau |b[i][j]| = 0 atunci relaia o putem scrie ca o disjuncie logic
cu doi literali.
O relaie de genul 0 <= xx + yy <= 1 poate fi tansformat logic n ( xx yy), astfel
xx i yy nu vor fi n acelai timp 1, una de genul 1 <= xx + yy <= 2 va fi transformat n
(xx yy), astfel cel puin xx sau yy va fi egal cu 1, alta de tipul 0 <= xx - yy <= 1 poate
fi scris ca (xx yy), una de tipul 2 <= xx + yy <= 3 n (xx yy), iar una de tipul 0
<= -xx -yy <= 1 n ( xx yy), una de tipul 1 <= xx yy <= 2 n (xx yy).

Astfel am redus problema la rezolvarea unei instane de 2SAT. Avem N+M-1 necunoscute
i (N 1)(M 1) propoziii, folosind a treia metod de rezolvare vom obine un algoritm
de complexitate O(NM) care soluioneaz problema noastr.
S vedem cum merge acest rezolvare pe exemplul din problem:
323
S=233
121

Alegem A[0][0] = 1, vom avea necunoscutele x1, x2, x3 i y1, y2, y3.
1 x1 x2 x3
y1 A[1][1] A[1][2] A[1][3]
y3 A[2][1] A[2][2] A[2][3]
y3 A[3][1] A[3][2] A[3][3]

Folosind recurena (*) obinem c matricea


100 0
b= 020 3
0 0 1 -1
010 1
De aici obinem sistemul de inegaliti:
0 <= x1 < = 1, 0 <= x2 <= 1, 0 <= x3 <= 1
0 <= y1 <= 1, -2 <= -x1 y1 <= -1, 0 <= -x2 +y1 <= 1, -3 <= -x3 y1 <= -2,
0 <= y2 <= 1, 0 <= x1 y2 <= 1, -1 <= x2 +y2 <= 0, 1 <= x3 y2 <= 2,
0 <= y3 <= 1, -1 <= -x1 y3 <= 0, 0 <= -x2 +y3 <= 1, -1 <= -x3 y3 <= 0
Transformm relaiile astfel ca s nu apar nici o constant negativ:
0 <= x1 < = 1, 0 <= x2 <= 1, 0 <= x3 <= 1
0 <= y1 <= 1, 1 <= x1 + y1 <= 2, 0 <= -x2 +y1 <= 1, 2 <= x3 + y1 <= 3,
0 <= y2 <= 1, 0 <= x1 y2 <= 1, 0 <= -x2 -y2 <= 1, 1 <= x3 y2 <= 2,
0 <= y3 <= 1, 0 <= x1 +y3 <= 1, 0 <= -x2 +y3 <= 1, 0 <= x3 +y3 <= 1
Acest sistem l putem transforma ntr-o expresie boolean:
( x1 y1) ( x2 y1) ( x3 y1)
( x1 y2) ( x2 y2) ( x3 y2)
( x1 y3) ( x2 y3) ( x3 y3).
Acest expresie e satisfcut de valorile: x1 = 1, x2 = 0, x3 = 1, y1 = 1, y2 = 0, y3 = 0, iar
de aici putem determina o soluie a problemei noastre iniiale ca fiind:
1101
1011
0110
0000

Bibliografie:
[1] T. H. Cormen, C. E. Leiserson, R. R. Rivest, Introducere in algoritmi
[2] http://en.wikipedia.org/wiki/Satisfiability
[3] BOI 2001 documents
[4] CEOI 2002 documents

S-ar putea să vă placă și