You are on page 1of 7

Arbore partial de cost minim

Fie urmatoarea problema concreta:



Se dau n orase precum si costul conectarii anumitor perechi de
orase. Se cere sa se aleaga o parte din muchii astfel incat se
asigure existenta unui lant intre oricare doua orase si costul
total sa fe minim.

G=(V, E) un graf neorientat, unde V are n elemente (n noduri)
si E are m elemente (m muchii). Se cunosc costurile
muchiilor. Prin eliminarea unor muchii se obtine un graf partial.
aca acesta este arbore se !a numi arbore partial.

"ostul unui arbore este egal cu suma costurilor muchiilor sale.
#rborele partial de cost minim este un arbore pentru care
suma este minima.

Problema. Fie un graf conex pentru care se cunosc costurile
muchiilor. Sa se determine arborele de cost minim asociat
(costul arborelui si !ectorul de tati).


$ %

&


4 2 1 7

4

Vom utiliza 2 vectori :
Vectorul s, pentru care s[i]=0 daca nodul i a fost adaugat la arbore sau s[i]= daca
i nu a fost adaugat la arbore si e!ista muc"ie intre i si de#a adaugat si are valoare
minima
Vectorul t, vector de tati

$lgoritmul consta in urmatoarele:
%e citeste nodul de pornire , v
%e incarca in s valoarea v
%[v]=0 &arborele contine nodul v'
%pre e!emplu daca v=1 se obtine:
%=(0 1 1 1 1)
*=(0 0 0 0 0)

+e n ,1 ori :
o se determina cel mai apropiat nod &neadaugat inca la arbore' de arborele
partial construit si muc"ia de cost minim min
o %e marc"eaza pentru nod: t[nod]=s[nod]
o %e adauga min la cost : cost=cost-min
o %e marc"eaza nod ca fiind adaugat la arbore: s[nod]=0
o %e actualizeaza datele :
+aca distanta de la i la arbore &a[i][s[i]]' este mai mare
decat distanta de la i la nodul nod tocmai adaugat la arbore
&a[i][nod]' se modifica potentialul ascendent pentru i:
s[i]=nod
Pas1
.od=2
/uc"ia de cost minim este 1,2 min=2, cost=2
%e obtine :
%=(0 0 2 2 1)
*=(0 1 0 0 0)



$ %

&


4 2 1 7

4


Pas2
.od=4
/uc"ia de cost minim este &2,4' min=1, cost=0
%=(0 0 4 0 1)
*=(0 1 0 2 0)




$ %

&


4 2 1 7

4



Pas 3
.od=1
/uc"ia de cost minim &1,1' min=0 cost=2
%=(0,0,4,0,0)
*=(0 1 0 2 1)




$ %

&


4 2 1 7

4



Pas 4
.od=0
/uc"ia de cost minim &4,0', min=4, cost=10
%=(0 0 0 0 0)
*=(0 1 4 2 1)



' %

&


4 2 1 7

4



3 solutie de implementare:
4include5fstream6"7
4include5values6"7
4include5conio6"7

int n,m,v,s[20],t[20]8
long int a[20][20],min8
const long int infinit=/$9:3.;8

void citire&'
(int i,#,!,<,z8
fstream f8
f6open&=arbminim6t!t=,ios::in'8
if&f'
cout55=o=55endl8
else cout55=error>>=8

f77n77m8

for&i=18i5=n8i--'
for&#=18#5=n8#--'
(if&i==#'
a[i][#]=08
else
a[i][#]=infinit8
)

for&i=18i5=m8i--'
(f77!77<77z8
a[!][<]=a[<][!]=z8)

)


int cauta?nod&int @nod'
( min=infinit8
for&int i=18i5=n8i--'
if&s[i]>=0'
if&a[i][s[i]]5min'
(min=a[i][s[i]]8
nod=i8)
return min8
)

void actualizeaza&int nod'
(for&int i=18i5=n8i--'
if&s[i]'
if&a[i][s[i]]7a[i][nod]'
s[i]=nod8

)

void main&'
( int ,i,#,cost=08
clrscr&'8
citire&'8
cout55=nodul de inceput =8
cin77v8
s[v]=08
for&i=18i5=n8i--'
if&i>=v'
s[i]=v8

int nod8
for&=185=n,18--'
(min=cauta?nod&nod'8
t[nod]=s[nod]8
cost=cost-min8
s[nod]=08
actualizeaza&nod'8
)

cout55=costul este =55cost55endl8
cout55=arborele de cost minimal =8
for&i=18i5=n8i--'
cout55t[i]55= =8
getc"&'8
)