You are on page 1of 24

Párosı́tás páros gráfokban

Olimpiai felkészı́tő, 2022


Horváth Gyula
horvath@inf.elte.hu
1. Páros gráfok
1.1. definı́ció. A G = (V, E) irányı́tatlan gráfot páros gráfnak nevezzük, ha a pontok V halmaza
felbontható olyan két diszjunk A és B halmazra, V = A ∪ B , hogy minden e = (u, v) ∈ E élre teljesül,
hogy u ∈ A és v ∈ B vagy u ∈ B és v ∈ A.

A továbbiakban, ha külön nem hangsúlyozzuk, akkor gráfon mindig páros gráfot értünk.
Feltesszük továbbá, hogy nincs izolált pont, azaz bármely a ∈ A ponthoz van olyan b ∈ B, hogy
(a, b) ∈ E , és bármely b ∈ B ponthoz van olyan a ∈ A, hogy (a, b) ∈ E .

1.2. definı́ció. Tetszőleges M ⊆ E élhalmaz esetén és A ⊆ V ponthalmaz esetén jelölje M(A) az
M -beli élek azon végpontjait, amelyek az A halmazban vannak: M(A) = {a ∈ A : (∃b)(a, b) ∈ M}.

1.3. definı́ció. A G = (A + B, E) páros gráfban élek egy M ⊆ E halmazát párosı́tásnak nevezzük, ha


bármely a ∈ M(A) ponthoz pontosan egy olyan b ∈ B pont van, hogy (a, b) ∈ M , és fordı́tva, bármely
b ∈ M(B) ponthoz pontosan egy olyan a ∈ A pont van, hogy (a, b) ∈ M .
2. Problémák
2.1. Maximális párosı́tás
A legnagyobb elemszámú M párosı́tás kiszámı́tása.

2.2. Minimális lefedő ponthalmaz


Egy C ⊆ V ponthalmazt lefedőnek nevezünk, ha bármely e = (u, v) ∈ E él esetén u ∈ C és v ∈ C.
Számı́tsunk ki egy C minimális elemszámú lefedő ponthalmazt.

2.3. Maximális független ponthalmaz


Egy D ⊆ V ponthalmazt függetlennek nevezünk, ha bármely e = (u, v) él esetén vagy u ∈
/ D vagy
v∈
/ D.
Számı́tsunk ki egy maximális elemszámú független ponthalmazt.

2.4. Minimális lefedő élhalmaz


Egy F ⊆ E élhalmazt lefedőnek nevezünk, ha bármely a ∈ A ponthoz van olyan b ∈ B, hogy (a, b) ∈
F , és bármely b ∈ B ponthoz van olyan a ∈ A, hogy (a, b) ∈ F .
Számı́tsunk ki egy minimális elemszámú lefedő élhalmazt.
2.1. definı́ció. Egy v0 , v1 , . . . , vk utat alternálónak nevezünk, ha az útban egymást követő pontok
különböző partı́ciókban vannak: azaz bármely i-re vi ∈ A és vi+1 ∈ B, vagy vi ∈ B és vi+1 ∈ A.

2.2. definı́ció. Legyen M ⊆ E párosı́tás a G = (A + B, E) gráfban és P = a0 , b1 , a1 , . . . , ak , bk+1 al-


ternáló út. Azt mondjuk, hogy a P út növelőút az M párosı́táshoz, ha teljesülnek az alábbi feltételek:

a0 ∈ A és a0 ∈
/ M(A)
bk+1 ∈ B és bk+1 ∈
/ M(B)
(ai , bi ) ∈ M minden i = 1, . . . , k

b1 b2 b3 b4

a0 a1 a2 a3
1. ábra. Az a0 , b1 , a1 , b2 , a2 , b3 , a3 , b3 , a3 , b4 út növelőút az M = {(a1 , b1 ), (a2 , b2 ), (a3 , b3 )}
párosı́tásra nézve. Látható, hogy ha a pirossal szı́nezett M -beli éleket töröljük a párosı́tásból, majd
bevesszük a zölddel szı́nezett éleket, akkor eggyel nagyobb elemszámú párosı́tást kapunk.
2.3. tétel. Egy M párosı́tás akkor és csak akkor maximális, ha nincs M -hez tartozó növelőút.

Bizonyı́tás. Indirekt módon bizonyı́tunk.


(⇒) Legyen P = a0 , b1 , . . . , ak , bk+1 növelőút M -hez. Töröljük M -ből a (ai , bi ) i = 1, . . . , k éleket,
majd vegyük be a párosı́tásba a (ai , bi+1 ), i = 0, . . . , k éleket. Így eggyel nőtt a párosı́tásban az élek
száma, ami ellentmond a feltevésnek, hogy M maximális.
(⇐) Legyen M olyan párosı́tás, ami nem maximális. Ekkor van olyan M ∗ párosı́tás, hogy |M| < |M ∗ |.
Legyen Q az M és az M ∗ élhalmazok szimmetrikus különbsége, azaz Q = (M ∗ − M) ∪ (M − M ∗ ).
Ekkor teljesülnek az alábbiak:

• Q nak több eleme van M ∗ -ból, mint M -ből, mert |M ∗ − M| > |M − M ∗ | .

• Minden pont legfeljebb egy M Q-beli él végpontja és legfeljebb egy M ∗
T T
Q-beli él végpontja.

• Tehát a Q-beli élek olyan utakat képeznek, amelyekben az egymást követő pontokat M -beli,
majd M ∗ -beli élek.

• Tehát kell lennie olyan útnak, amely több M ∗ -beli élet tartalmaz, mint M -belit. Ami azt jelenti,
hogy az ilyen út növelőút M -ben.


E tétel alapján nyilvánvalóan adhatunk algoritmust maximális párosı́tás kiszámı́tására.
Kiindulva egy tetszőleges (pl. üres) párosı́tásból, addig keresünk növelőutat, ameddig a keresés si-
kertelen nem lesz. Növelőút keresése megvalósı́tható a mélységi bejárás stratégiáját követve. Adott
a ∈ A pontra, ami nincs párosı́tva, egyetlen mélységi bejárással meghatározható egy növelőút, ha
létezik, és elvégezhető a párosı́tás módosı́tása. Belátható, hogy minden A-beli pontra legfeljebb
egyszer kell növelőút keresést végezni. Ugyanis, ha adott M párosı́tásra nem létezik a-ból induló
növelőút, akkor későbbi növelőút módosı́tások után sem lesz.
Tehát az algoritmus futási ideje O(n · m), ahol n a pontok száma, m pedig az élek száma.
2.5. Megvalósı́tás
Legyen G = (V = A + B, E) a bemeneti páros gráf. A párosı́tást egy Par : V → V függvénnyel
reprezentáljuk úgy, hogy Par[p] = p ha p nem végpontja párosı́tásbeli élnek, azaz nincs párosı́tva,
egyébként Par[a] = b és Par[b] = a ha az (a, b) él eleme a párosı́tásnak.
A mélységi bejárást úgy végezzük, hogy ha B beli párosı́tott b ponthoz érünk, akkor a b → Par[b]
élen megyünk tovább. Rekurzı́v módon, sikeres visszatérés után módosı́tjuk a párosı́tást (a Par
függvényt).
1 # include < b i t s / stdc ++.h>
2 # define maxN 10001
3 using namespace std ;
4
5 vector<i n t > G[maxN ] ;
6 i n t Szin [maxN ] ;
7 i n t Par [maxN ] ; / / Par [ x ]= x , ha x nem páros ı́ t o t t , egy ébk é nt Prar [ x ] az x pá r j a
8 bool A[maxN ] ; / / az A+B p a r t ı́ c i ó reprenzent á l ása
9 bool L [maxN ] ;
10 i n t n , most=0;
11 bool NoveloUtKeres ( i n t a ) {
12 / / Globalis : G, Par , Szin , most , A[ a ] igaz
13 Szin [ a ]=most ;
14 f o r ( i n t b :G[ a ] ) {
15 i f ( Szin [ b]==most ) continue ;
16 i f ( Par [ b]==b) {
17 Par [ a ]=b ; Par [ b]= a ;
18 return true ;
19 } else {
20 Szin [ b]=most ;
21 i f ( NoveloUtKeres ( Par [ b ] ) ) {
22 Par [ a ]=b ; Par [ b]= a ;
23 return true ;
24 }
25 }
26 }
27 return false ;
28 }
29 i n t MagyarModszer ( ) {
30 / / Globalis : G, Par , Szin
31 / / A+B prar ı́ c i ó meghatároz ása
32 queue<i n t > S;
33 f o r ( i n t x =1;x<=n ; x++) {
34 A[ x ]= f a l s e ;
35 Szin [ x ] = 0 ;
36 }
37 A[ 1 ] = t r u e ; most++; Szin [ 1 ] = most ;
38 S . push ( 1 ) ;
39 while ( ! S . empty ( ) ) {
40 i n t x=S . f r o n t ( ) ; S . pop ( ) ;
41 f o r ( i n t y :G[ x ] )
42 i f ( Szin [ y]<most ) {
43 Szin [ y ]=most ;
44 A[ y ] = !A[ x ] ;
45 S . push ( y ) ;
46 }
47 }
48 i n t parokszama =0;
49 f o r ( i n t x =1;x<=n ; x++) Par [ x ]= x ;
50 / / Növ e l ő utak keres ése
51 f o r ( i n t a =1;a<=n ; a++)
52 i f (A[ a ] && Par [ a]==a ) {
53 most++;
54 i f ( NoveloUtKeres ( a ) )
55 parokszama++;
56 }
57 r e t u r n parokszama ;
58 }
59 void Beolvas ( ) {
60 i n t m, x , y ;
61 cin>>n>>m;
62 f o r ( i n t i =1; i <=m; i ++) {
63 cin>>x>>y ;
64 G[ x ] . push back ( y ) ;
65 G[ y ] . push back ( x ) ;
66 }
67 }
68 i n t main ( ) {
69 Beolvas ( ) ;
70 i n t m=MagyarModszer ( ) ;
71 cout<<m<<endl ;
72 f o r ( i n t a =1;a<=n ; a++)
73 i f (A[ a ] && Par [ a ] ! = a ) {
74 cout<<a<<” ”<<Par [ a]<< endl ;
75 }
76 return 0;
77 }
Tekintsük azt a maximális párosı́tást a G = (V = A + B, E) gráfban, amely Par függvénnyel van
megadva.

2.4. definı́ció. Legyen L(x) akkor és csak akkor igaz, ha van olyan a ∈ A nem párosı́tott pont,
amelyből x elérhető alternáló úton. Alternáló; az élek irányı́tása A → B ha nem párosı́tott, B → A ha
párosı́tott az él. Ha az x pontra L(x) igaz, akkor azt mondjuk, hogy x L-cı́mkézett.

Definiáljuk a gráf pontjainak az alábbi részhalmazait.


A1 = {x : A(x) ∧ Par(x) = x}: a nem párosı́tott A-beli pontok halmaza
A2 = {x : A(x) ∧ Par(x) 6= x ∧ L(x}: a párosı́tott A-beli L-cı́mkézett pontok halmaza.
A3 = {x : A(x) ∧ Par(x) 6= x∧!L(x)}: a párosı́tott A-beli nem L-cı́mkézett pontok halmaza.
B1 = {x :!A(x) ∧ Par(x) = x}: a nem párosı́tott B-beli pontok halmaza.
B2 = {x :!A(x) ∧ Par(x) 6= x ∧ L(x): a párosı́tott B-beli L-cı́mkézett pontok halmaza.
B3 = {x :!A(x) ∧ Par(x) 6= x∧!L(x)}: a párosı́tott B-beli nem L-cı́mkézett pontok halmaza.

A3 B3

A2 B2

B1
A1

J
2. ábra. Élek osztályozása. Az L cı́mkézett pontok jele:
2.6. Az L függvény kiszámı́tása

1 void A l t B e j a r ( i n t x ) {
2 L [ x ]= t r u e ;
3 Szin [ x ]=most ;
4 f o r ( i n t y :G[ x ] ) {
5 i f ( Szin [ y]==most ) continue ;
6 i f (A[ x ] && Par [ x]==x | | !A[ x ] && Par [ x]==y )
7 AltBejar ( y ) ;
8 }
9 }
3. Problémák megoldása
A G = (V = A + B, E) gráfon hajtsuk végre a MagyarModszer eljárást és az L-cı́mkézést állı́tsuk elő
AltBe jar-al.

1 / / L−c ı́mkéz és k i s z ámı́ t ása


2 f o r ( i n t x =1;x<=n ; x++) L [ x ]= f a l s e ;
3 most++;
4 f o r ( i n t x =1;x<=n ; x++)
5 i f (A[ x ] && Par [ x]==x && Szin [ x]<most )
6 AltBejar ( x ) ;
Az emlı́tett problémák megoldhatók az A1, A2, A3, B1, B2, B3 halmazok alapján.
3.1. Maximális párosı́tás

1 m=MagyarModszer ( ) ;
2 cout<<m<<endl ;
3 f o r ( i n t a =1;a<=n ; a++)
4 i f (A[ a ] && Par [ a ] ! = a )
5 cout<<a<<” ”<<Par [ a]<< endl ;
3.2. Minimális lefedő ponthalmaz
3.1. tétel (König tétel). A maximális párosı́tás elemszáma megegyezik a minimális lefedő ponthal-
maz elemszámával.
S
C = A3 B2
1 vector<i n t > C;
2 f o r ( i n t x =1;x<=n ; x++)
3 i f ( A[ x ] && ! L [ x ] | | !A[ x ] && L [ x ] )
4 C. push back ( x ) ;
5 cout<<C. s i z e ()<< endl ;
6 f o r ( i n t x :C) cout<<x<<” ” ; cout<<endl ;

A3 B3

A2 B2

B1
A1

3. ábra.
3.3. Maximális független ponthalmaz
D = V − (A3 B2) = A1 A2 B1 B3
S S S S

1 vector<i n t > D;
2 f o r ( i n t x =1;x<=n ; x++) {
3 i f ( ( A[ x ] && ( Par [ x]==x | | Par [ x ] ! = x && L [ x ] ) ) | |
4 ( ! A[ x ] && ( Par [ x]==x | | Par [ x ] ! = x &&!L [ x ] ) ) )
5 D. push back ( x ) ;
6 }
7 cout<<D. s i z e ()<< endl ;
8 f o r ( i n t x :D) cout<<x<<” ” ; cout<<endl ;

A3 B3

A2 B2

B1
A1

4. ábra.
3.4. Minimális lefedő élhalmaz
Párosı́tó élek + egy-egy A1 → B2 és B1 → A3 él.
1 vector<pair <i n t , i n t >> F ;
2 f o r ( i n t x =1;x<=n ; x++)
3 i f (A[ x ] ) {
4 i f ( Par [ x ] ! = x ) {
5 F . push back ( { x , Par [ x ] } ) ;
6 } else { / / A1−>B2 é l k e l l
7 f o r ( i n t b :G[ x ] )
8 i f ( Par [ b ] ! = b && L [ b ] ) {
9 F . push back ( { x , b } ) ;
10 break ;
11 }
12 }
13 } else { / / B( x ) : B1−>A3 é l k e l l
14 i f ( Par [ x]==x )
15 f o r ( i n t a :G[ x ] )
16 i f ( Par [ a ] ! = a && ! L [ a ] ) {
17 F . push back ( { a , x } ) ;
18 break ;
19 }
20 }
21 cout<<F . s i z e ()<< endl ;
22 f o r ( auto ab : F ) cout<<ab . f i r s t <<” ”<<ab . second<<endl ;
4. Játék a sı́kon (IOIV2021)
Alı́z és Béla a következő játékot játsszák. Adott a sı́kon N kijelölt pont, amelyek mindkét koordinátája
egész szám. Felváltva lépnek egy bábuval, csak olyan kijelölt pontra lehet lépni, amely a bábu
aktuális helyétől 1 egység távolságra van, és nem járt még ott a bábu. Alı́z kezd, ő leteheti a bábut
egy általa választott kijelölt pontra. Ezt követően Béla lép egy 1 egység távolságú pontra, majd Alı́z
egy újabb szomszédos pontra, és ı́gy tovább, amı́g tudnak lépni. Az veszı́t, aki már nem tud lépni
olyan pontra, ahol még nem járt a bábu.
Készı́ts programot, amely a kijelölt pontok ismeretében megadja hogy Alı́z melyik pontokon kezd-
ve nyerheti meg biztosan a játékot (feltéve hogy Béla optimálisan játszik)!

Bemenet
A standard bemenet első sorában N , a kijelölt pontok száma található.
A következő N sorban a kijelölt pontok találhatóak, soronként 2 szám: az i. sorban Xi és Yi , az i.
kijelölt pont x és y koordinátája.

Kimenet
A standard kimenet első sorába W álljon, azon pontok száma amelyeken kezdve Alı́z biztosan meg
tudja nyerni a játékot! A következő W sorban következzenek ezek a pontok tetszőleges sorrendben.
Példa bemenet és kimenet
bemenet kimenet
5 3
0 0 1 0
0 1 0 1
1 0 1 2
1 1
1 2
4.1. Megoldás
Tekontsük azt a G = (V, E) gráfot, ahol a pontok V halmaza a játékban kijelölt pontok a sı́kon, és
(x1 , y1 ) → (x2 , y2 ) akkor és csak akkor él, ha lehet lépni egyikből a másikba, azaz (x1 + y1 )%2 6=
(x2 + y2 )%2. Tehát a gráf páros gráf, legyen A = {(x, y) ∈ V : (x + y)%2 = 0} és B = {(x, y) ∈ V :
(x + y)%2 = 1} .
Állı́tás. Bármely olyan pont, amely nem párosı́tott valamely maximális párosı́tásra nézve nyerő
kezdőállás Alı́z számára.
Bizonyı́tás. Legyen M ⊆ E tetszőleges maximális párosı́tás és p olyan pont, amely nem párosı́tott
M ben.
Alı́z stratégiája legyen az, hogy ha párosı́tott pontból kell lépnie, akkor annak a pontnak a párját
választja. Béla sosem léphet párosı́tatlan pontba, mert akkor lenne növelőút, ami ellentmond annak,
hogy M maximális párosı́tás. Tehát Béla legfeljebb |M| lépés után nem tud lépni.
Állı́tás. Ha p olyan pont, hogy bármely maximális párosı́tás esetén p párosı́tott, akkor p vesztő
kezdőállás Alı́z számára.
Bizonyı́tás. Legyen M tetszőleges maximális párosı́tás. Ha Béla stratégiája legyen az, hogy mindig
a párosı́tott pont párját választja. Ekkor Alı́z sosem léphet párosı́tatlan pontba. Ha Lenne olyan
lépéssor, amelynek utolsó pontja párosı́tatlan, akkora törölve a lépések során érintett párosı́tott
éleket, majd bevéve a lépések során érintett nem párosı́tott éleket, ismét maximális párosı́tást ka-
punk, amelyben p nem párosı́tott. Ez ellentmond a feltevésünknek.
Állı́tás. Legyen M tetszőleges maximális párosı́tás és p ∈ V párosı́tott pont. Akkor és csak akkor
van olyan maximális párosı́tás, amelyben p nem párosı́tott, ha van olyan q p alternáló út, hogy q
nem párosı́tott.

q
5. ábra.
Tehát a feladat megoldásához készı́tsünk egy maximális párosı́tást. A nem párosı́tott pontokat
vegyük be a megoldáshalmazba, és még az olyan párosı́tott p pontokat, amelyekre LA[p] igaz lesz
az LABe jar végrehajtása után.
1 void LABejar ( i n t x ) {
2 LA[ x ]= t r u e ;
3 Szin [ x ]=most ;
4 f o r ( i n t y :G[ x ] ) { / / minden x−>y é l r e
5 i f ( Szin [ y]==most ) continue ;
6 i f (A[ x ] && Par [ x ] ! = y | | !A[ x ] && Par [ x]==y )
7 LABejar ( y ) ;
8 }
9 }
Hasonlóan kell eljárni a B-beli pontokkal is.

You might also like