Sunteți pe pagina 1din 9

Informatic Teorie clasa a XI-a

Conexitate si TareConexitate
1. Conexitatea grafurilor neorientate
Definiie: Un graf se numete
conex dac pentru oricare dou
vrfuri x i y diferite ale sale, exist
un lan care le leag.
Spre exemplu, cele dou grafuri folosite
pentru ilustrarea metodelor de parcurgere
sunt conexe; oricare dou vrfuri ale lor
sunt unite printr-un lan. Graful din figura de mai sus nu este conex; spre exemplu ntre vrfurile ! i "
nu exist nici-un lan.
Definiie: Se numete component conex a grafului G=(X,U), un su#graf C=(X1,U1) conex al lui G
care are proprietatea c nu exist nici un lan n G care s lege un vrf din mulimea X1 cu un vrf din
mulimea X-X1.
Spre exemplu, pentru graful anterior, C=( X1,U1) unde X1=!,",#,$% iar U1=&!,"', &",$', &!,$',
&!,#'% este o component conex.
Se pune pro#lema verificrii conexitii unui graf i eventual a determinrii componentelor sale
conexe. $entru re%olvarea acestei pro#leme exist mai muli algoritmi.
1.1 Utili(area parcurgerilor )* +i D* pentru ,erificarea conexitii
Se tie c n urma parcurgerii )* a unui graf neorientat o#inem o list a vrfurilor care, de fapt,
repre%int mulimea tuturor vrfurilor care sunt legate prin lanuri de un vrf dat. &ac n urma
parcurgerii )* rmn vrfuri nevi%itate, graful nu este conex. 'n acest ca%, putem afia componentele
conexe ale grafului. (nalog putem proceda utili%nd metoda de parcurgere D* pentru un graf
neorientat. 'n am#ele ca%uri, pentru fiecare vrf rmas nevi%itat se apelea% metoda de parcurgere,
vrful respectiv fiind primul dintr-o nou component conex.
Urmatorul program foloseste parcurgerea )*:
#include<iostream.h>
#include<fstream.h>
#define N 20
typedef unsigned char tip;
void citire(tip a[N][N]int !n"
{
int #y;
ifstream f($.....$$r$";
f>>n; //numarul de varfuri
%hile(&f.eof(""
{
f>>#>>y; //extremitatile unei muchii
a[#][y]'a[y][#]'(;
}
f.close(";
}
void )*(tip a[N][N]int ntip vi+[N]tip c[N]int vint !u"
,
int p-;
p'u'(; vi+[v]'(; c[p]'v;
%hile(p<'u"
,
1
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
v'c[p];
for(-'(;-<'n;-.."
if(a[v][-]!!&vi+[-]"
,
vi+[-]'(; c[..u]'-;
/
p..;
/
/
void afisare0)*(tip c[N]int u"
,
int i;
for(i'(;i<'u;i.." cout<<c[i];
cout<<1endl1;
/
void main("
,
tip a[N][N]',0/vi+[N]',0/c[N]; int nunc'0i;
citire(an";
for(i'(;i<'n;i.."
if(&vi+[i]" //caut primul varf nevizitat
,
cout<<12n componenta cone#a 1<<..nc<<13 1;
)*(anvi+ciu";
//construiesc componenta conexa care contine vf. i
afisare0)*(cu"; //afisez comp. conexa
/
if(nc''(" cout<<endl<<1 graful este cone# 1<<endl;
else cout<<endl<<1graf necone# cu 1<<nc<<1 componente cone#e1<<endl;
/
Urmatorul program foloseste parcurgerea D*:
#include<iostream.h>
#include<fstream.h>
#define N 20
typedef unsigned char tip;
void citire(tip a[N][N]int !n"
{
int #y;
ifstream f($.....$$r$";
f>>n; //numarul de varfuri
%hile(&f.eof(""
{
f>>#>>y; //extremitatile unei muchii
a[#][y]'a[y][#]'(;
}
f.close(";
}
void 4*(tip a[N][N]int ntip vi+[N]int v"
,
int -;
vi+[v]'(; cout<<v;
for(-'(;-<'n;-.."
if(a[v][-]!!&vi+[-]" 4*(anvi+-";
/
void main("
,
tip a[N][N]',0/vi+[N]',0/; int nnc'0i;
citire(an";
for(i'(;i<'n;i.."
2
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
if(&vi+[i]" //primul varf nevizitat
,
cout<<endl<<1componenta cone#a 1<<nc<<13 1;
4*(anvi+i"; cout<<12n1"; //construiesc comp. conexa
care contine i
/
if(nc''(" cout<<endl<<1graful este cone#1<<endl;
else cout<<endl<<1graf necone# cu 1<<nc<<1 componente cone#e1<<endl;
/
1.- .erificarea conexitii folo/in0 algoritmul 1oy-2ar/3all
)olosind matricea de existen a lanurilor generat cu algoritmul *o+-,ars-all, putem
determina toate componentele conexe ale unui graf, ele fiind memorate ntr-o matrice #inar C cu nc
linii, unde nc este numrul componentelor conexe. 'n aceast matrice C&i'&4'=1 dac vrful 4 aparine
componentei conexe i. .onstruim mai nti componenta conex care conine vrful / i o memorm pe
prima linie a matricii C. 0rfurile incluse n aceast component le marcm cu / n vectorul .56.
.utm apoi primul vrf i nemarcat n vectorul .56 i construim componenta conex care conine acest
vrf. *epetm acest proces pn cnd nu mai gsim vrfuri nevi%itate, adic toate vrfurile au fost
incluse n componente conexe. (vanta1ul acestei metode const n faptul c vrfurile care formea% o
component conex sunt pstrate n memorie, n elementele vectorului C, putnd fi folosite pentru
prelucrri ulterioare aplicate respectivelor componente.
#include<iostream.h>
#include<fstream.h>
#define N 20
typedef unsigned char tip;
void citire(tip a[N][N]int !n"
{
int #y;
ifstream f($.....$$r$";
f>>n; //numarul de varfuri
%hile(&f.eof(""
{
f>>#>>y; //extremitatile unei muchii
a[#][y]'a[y][#]'(;
}
f.close(";
}
void 5oy06arshall(tip a[N][N]int n"
,
int i-7;
for(7'(;7<'n;7.."
for(i'(;i<'n;i.."
for(-'(;-<'n;-.."
if(&a[i][-]" a[i][-]'a[i][7]8a[7][-];
/
int 9asit(tip vi+[]int n"
//returneaza primul varf neinclus intr-o componenta conexa
,
for(int i'(;i<'n;i.."
if(&vi+[i]" return i;
return 0;
/
void det0comp0cone#e(tip a[N][N]int ntip vi+[]tip c[N][N]int !nc"
,
int i-;
nc'(; vi+[(]'(; c[nc][(]'(; //componenta conexa care contine varful 1
for(-'2;-<'n;-.."
if(a[(][-]"
3
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
,
c[nc][-]'(; vi+[-]'(; //adaugam toate vf. legate prin
lant de varful 1
/
i'9asit(vi+n";
%hile(i" //mai sunt varfuri neincluse in componente conexe
,
nc..; c[nc][i]'(; vi+[i]'(; //componenta conexa care contine
nodul i
for(-'2;-<'n;-.."
if(a[i][-]"
,
c[nc][-]'(; vi+[-]'(;
/
i'9asit(vi+n";
/
/
void afisare0comp0cone#e(tip c[N][N]int nint nc"
,
int i-;
cout<<endl<<endl<<19raful are 1<<nc<<1 componente cone#e1<<endl;
for(i'(;i<'nc;i.."
,
cout<<1c[1<<i<<1]3 1;
for(-'(;-<'n;-.."
if(c[i][-]" cout<<-;
cout<<endl;
/
/
void main("
,
tip a[N][N]',0/c[N][N]',0/vi+[N]; int nnc;
citire(an"; 5oy06arshall(an";
det0comp0cone#e(anvi+cnc";
afisare0comp0cone#e(cnnc";
/
1.7 8eto0a 9ee pentru ,erificarea conexitatii
2etoda deriv din algoritmul de verificare a aciclitii unui graf. 0om folosi un vector cu n
elemente, n fiind numrul de vrfuri ale grafului, cu semnificaia: x&i'3numrul componentei conexe din
care face parte vrful i. 4niial x&i'=i, i 1,-,..n%. $entru fiecare muc-ie &i,4' din graf unificm
componenta conex din care face parte vrful i 5componenta x&i'6 cu cea din care face parte vrful 4
5componenta x&4'6, adic peste tot unde n vectorul x apare valoarea x&4' vom pune valoarea x&i'
5sc-im#m marca1ul6. 'n final, dac n x exist elemente distincte 5cu marca1e diferite6 nseamn c
graful nu este conex, altfel nseamn c el este conex fiind posi#il c-iar o determinare a
componentelor conexe pe #a%a vectorului x, deoarece toate vrfurile care fac parte din aceeai
component conex au acelai marca1.
#include<iostream.h>
#include<fstream.h>
#define N 20
typedef unsigned char tip;
void citire(tip a[N][N]int !n"
{
int #y;
ifstream f($.....$$r$";
f>>n; //numarul de varfuri
%hile(&f.eof(""
4
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
{
f>>#>>y; //extremitatile unei muchii
a[#][y]'a[y][#]'(;
}
f.close(";
}
void det0comp0cone#e(tip a[N][N]int ntip #[N]"
,
int i-t;
for(i'(;i<'n;i.." #[i]'i; //marcajul initial
for(i'(;i<'n:(;i.."
for(-'i.(;-<'n;-.." //aici se gesesc muchiile distincte ale
grafului
if(a[i][-]" //exista in graf muchia i-j
for(t'(;t<'n;t.."
if(#[t]''#[-]" #[t]'#[i]; //reunim
componentele conexe
/
void afisare0comp0cone#e(tip #[N]int n"
,
int i-nc'07;
for(i'(;i<'n;i.."
if(#[i]"
,
nc..; 7'#[i]; //marcajul componentei conexe
cout<<endl<<1componenta cone#a 1<<nc<<13 1;
for(-'(;-<'n;-.."
if(#[-]''7" //i si jsunt in aceeasi componenta
conexa
,
#[-]'0; cout<<-; //sterg j
/
/
cout<<endl;
/
void main("
,
tip a[N][N]',0/#[N]; int n;
citire(an";
det0comp0cone#e(an#"; afisare0comp0cone#e(#n";
/
-.Grafuri 3amiltoniene
Definiie: 'ntr-un graf conex G=(X,U) se numete ciclu
3amiltonian 5C:6 un ciclu elementar care conine toate
vrfurile grafului.
Definiie: Se numete graf 3amiltonian un graf care conine
un ciclu -amiltonian.
'n graful alturat, un exemplu de ciclu -amiltonian este:
;<'[(2=>?@A(]
;eorem< Graful complet =n este -amiltonian.
5
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
7 condiie suficient ca un graf s fie -amiltonian a fost enunat de matematicianul &irac n
/89!.
;eorema lui Dirac: &ac G=(X,U) este un graf cu n7 vrfuri astfel nct gradul fiecrui vrf xX
satisface condiia gra0(x)n>-, atunci G este -amiltonian.
:eorema lui &irac d o condiie suficient, nu i necesar.
Spre exemplu, graful de mai 1os este -amiltonian dei nu
satisface teorema lui &irac.
Definiie: Se numte lan 3amiltonian un lan elementar
care conine toate vrfurile grafului.
$entru re%olvarea algoritmic a pro#lemei existenei ntr-un graf oarecare a unui C: se
folosete metoda backtracking 5complexitate exponenial6. $entru a nu genera de mai multe ori
acelai C: se pleac de exemplu din vrful ,=1. &ac o#inem cel puin un ciclu de acest tip, graful
este -amiltonian i ciclul o#inut se afiea%, n ca% contrar, graful nu este -amiltonian.
7. Grafuri euleriene
Defini ie: )ie un graf G=(X,U). Se
numete ciclu eulerian 5C?6 un
ciclu care conine toate muc-iile
grafului. Un graf care conine un
ciclu eulerian se numete graf
eulerian.
'n graful alturat, un ciclu eulerian
este secvena:
C?=&1,1@,-,7,A,!,",7,#,$,1@,B,11,1-, 1@,17,1'
;eorem: Un graf G fr vrfuri i%olate este eulerian dac i numai dac este conex i gradele tuturor
vrfurilor sunt numere pare 5condiie necesar i suficient6.
(ceast teorem evidenia% i un algoritm cu a1utorul cruia putem construi un ciclu eulerian
ntr-un graf despre care tim c este eulerian. $entru aceasta, vom parcurge urmtorii pai:
- $ecm dintr-un vrf oarecare 5exemplu, ,=16. .onstruim un prim ciclu C parcurgnd vrfurile
accesi#ile din aproape n aproape pe muc-ii din graf micornd corespun%tor gradele
vrfurilor parcurse.
- (legem n continuare, dac mai este posi#il, un vrf al lanului C pentru care mai exist muc-ii
incidente cu el, neparcurse nc. .onstruim astfel un nou ciclu C1 pe care l concatenm cu
ciclul C, o#innd un ciclu C mai lung.
- *epetm pasul anterior ct timp mai exist muc-ii neparcurse.
$rogramul tre#uie s verifice mai nti dac graful este eulerian folosind teorema anterioar 5graf
conex i toate vrfurile de grad par6. $entru verificarea conexitii se poate folosi metoda de parcurgere
D*.
Definiie: Se numete lan eulerian un lan care conine toate muc-iile grafului, fiecare muc-ie fiind
pre%ent o singur dat.
;eorem: .ondiia necesar i suficient ca un graf conex s conin un lan eulerian de extremiti x
i y date, este ca vrfurile x i y s fie singurele vrfuri de grad impar ale grafului.
6
1 -
7
A
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
A. Conexitate +i tare conexitate in grafurile orientate
Definiie: Un graf orientat G=(X,U) se numete conex dac pentru oricare dou vrfuri distincte x,yX
exist n G un lan de extremiti x,y.
Se numete component conex a unui graf orientat G un su#graf conex al su maximal n
raport cu acest proprietate 5oricare ar fi un vrf din su#graf nu exist lan ntre acel vrf i vrfurile
care nu fac parte din su#graf6.
Definiie: &ac G este un graf orientat, numim graf /uport al lui G, graful neorientat o#inut prin
nlocuirea fiecrui arc din G cu muc-ia corespun%toare urmat de eliminarea muc-iilor multiple.
?xemplu<
'n desenul anterior este pre%entat un graf orientat i graful su suport, o#inut prin nlocuirea fiecrui
arc cu muc-ia corespun%roare, urmat de eliminarea muc-iilor multiple.
S o#servm c un graf orientat este conex dac i numai dac graful su suport este conex.
(adar pro#lema conexitii unui graf orientat, revine la pro#lema conexitii unui graf neorientat, i
anume, a grafului su suport. .onform acestei o#servaii, pentru verificarea conexitii unui graf
orientat, respectiv pentru afiarea componentelor conexe ale unui graf orientat neconex, putem utili%a
metodele pre%entate la grafurile neorientate, i anume parcurgerea )* i D*.
Definiie: Un graf orientat G=(X,U) este tare conex dac pentru oricare dou noduri ale sale, u,,X ,
u,, exist un drum de la u la , i un drum de la , la u.
Un exemplu de graf tare conex este graful asociat circulaiei rutiere; acesta tre#uie s permit
acces dus-ntors ntre oricare dou puncte dei poate cuprinde str% cu sens unic.
Definiie: Se numete component tare conex a unui graf orientat G=(X,U) un su#graf tare conex
al su :=(C,.) maximal n raport cu aceast proprietate.
?xemplu:
Graful din figura alturat este conex, dar nu este tare
conex,deoarece nu exist drumuri de la nodul ; la
celelalte noduri ale grafului.
7
1 -
7
A
1 -
7
A
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
Graful are dou componente tare conexe i anume
su#grafurile generate de mulimile de noduri 1,-,7% i
A%.
DE/er,aie: <innd cont de definiia grafului tare conex, deducem c matricea drumurilor asociat
unui astfel de graf are toate elementele egale cu /.
$entru determinarea componentelor tare conexe ale unui graf orientat pornind de la matricea
drumurilor construit cu algoritmul *o+-,ars-all, procedm astfel:
- notm cu F(i) mulimea nodurilor care sunt extremiti finale ale unor drumuri care pleac din i
5ea corespunde coloanelor pe care se afl elementele nenule de pe linia i6
- notm cu G(i) mulimea nodurilor care sunt extremiti iniiale ale unor drumuri ce se termin n
i5corespunde liniilor pe care se afl elementele nenule de pe coloana i6
- componenta tare conex care conine nodul i va fi mulimea (B(i" C(i"" ,i /
&e aici re%ult urmtorul algoritm:
D { D reprezint mulimea nodurilor din E pe care le-am inclus
deja
ntr-o component tare conex}
nc0 { nc reprezint numrul componentelor tare conexe}
pentru i'(n
dacF iD atunci
ncnc.(
determinF B(i"
determinF C(i"
comp[nc] B(i
i
" C(i" ,i/
scrie comp[nc]
sf0dacF
sf0pentru
$entru a implementa acest algoritm n lim#a1ul . vom simula operaiile cu mulimi cu a1utorul unor
vectori #inari. (stfel, 9&i'=1 dac nodul i a fost de1a inclus ntr-o component tare conex i 9&i'=@ n
ca% contrar. (nalog vom simula mulimile F i G avnd gri1 ca pentru fiecare component tare conex
este s fie iniiali%ate cu /. *e%ult urmtorul program:
#include<iostream.h>
#include<fstream.h>
#define N 20
typedef unsigned char tip;
void citire(tip a[N][N]int !n"
{
int #y;
ifstream f($.....$$r$";
f>>n; //numarul de varfuri
%hile(&f.eof(""
{
f>>#>>y; //extremitatile unei muchii
a[#][y]'a[y][#]'(;
}
f.close(";
}void 5oy06arshall(tip a[N][N]int n"
,
int i-7;
for(7'(;7<'n;7.."
for(i'(;i<'n;i.."
for(-'(;-<'n;-.."
if(&a[i][-]" a[i][-]'a[i][7]8a[7][-];
/
void det0succesori(tip a[N][N]int ntip B[N]int i"
8
Informatic Teorie clasa a XI-a
Conexitate si TareConexitate
//determina multimea !i"
,
int -;
for(-'(;-<'n;-.."
if(a[i][-]!!i&'-" B[-]'(;
/
void det0predecesori(tip a[N][N]int ntip C[N]int i"
//determina multimea #!i"
,
int -;
for(-'(;-<'n;-.."
if(a[-][i]!!i&'-" C[-]'(;
/
void afisare0componente(tip D[N]tip C[N]tip B[N]int nint ncint i"
,
cout<<endl<<1componenta tare cone#a 1<<nc<<1 3 1<<i;
for(int -'(;-<'n;-.."
if(B[-]8C[-]" //intersectia multimilor
,
cout<<1 1<<-<<1 1; D[-]'(;
/
cout<<12n1;
/
void componente0tare0cone#e(tip a[N][N]int n"
,
tip D[N]',0/B[N]',0/C[N]',0/; int inc'0;
for(i'(;i<'n;i.."
if(&D[i]"
,
nc..; D[i]'(; det0succesori(anBi";
det0predecesori(anCi";
afisare0componente(DCBnnci";
/
/
void main("
,
tip a[N][N]',0/; int n;
citire(an"; 5oy06arshall(an"; componente0tare0cone#e(an";
/
9

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