You are on page 1of 5

Codificare Prufer

Consideram un arbore partial oarecare T din T(Kn). Algoritmul lui
Prufer de codificare a arborelui T conduce la constructia unui (n-2)-vector

,

,

c(c1 c2,…, cn-2) peste [n] astfel incat t->c=( c1 c2,…, cn-2).El consta in
repetarea de n-2 ori, respectiv pentru j=1, 2, …, n-2, a urmatorului grup de
operatii:
(1) se determina multimea S a varfurilor de grad unu( a terminalelor)
din T: S=term(T);
(2) se selecteaza varful minim: xj =min S;
(3) se noteaza in vectorul cod varful cj adiacent lui xj;
(4) se sterge varful terminal xj din arborele T : T –xj ->T.
Observatii: (1) In procesul codificarii Prufer sunt obtinute cele n-2
componente ale vectorului cod c. Determinarea fiecarei componente cj este
insotita de stergerea varfului terminal minim xj din T adiacent lui cj, iar
graful obtinut este de asemenea arbore T-xj -> T . In total sunt sterse n-2
astfel de varfuri. Cele doua varfuri care raman sunt adiacente, iar unul dintre
ele este varful maxim n.
(2) In vectorul cod obtinut, un varf x apare de dT(x)-1 ori.
Astfel, varfurile terminale sunt singurele varfuri care nu apar in codul c.
//------------------------------------------------------------------------------------int GetInteger(const char* prompt, int min, int max, const char* err_msg="")
{
int num;
for(;;)
{
cout << prompt ;
cin >> num;
if(cin.fail() || num < min || num > max)
{
cin.clear();
cin.ignore(1024,'\n');
cout << err_msg << endl;
cout << "Dati un intreg intre " << min << " si " << max << endl;
}
else break;
}

void df_r(int **T. T[j][i] = 1.". 1. vf).\n". int vf) {int k. int i. x--. j = GetInteger("". } } //------------------------------------------------------------------------------------int GetTree(int ** T. Incercati din nou. continue. if(s[k]==0) df_r(T. s[nod]=1. x < vf. 1.". vf). i = GetInteger("". } //------------------------------------------------------------------------------------int s[50]. . for(int x = 1.k<=vf. int vf) { cout << "Introduceti cele " << vf-1 << " muchii ale arborelui : . k. x++) //citim cele n-1 muchii { cout << "\nMuchia #" << x << '\n'. if(i == j) // acest graf nu este arbore { cout << "Un graf nu este arbore daca un varf este conectat la el insusi. continue. int nod. vf). j.return num. x--.k++) if(T[nod][k]==1) {T[k][nod]=0. for(k=1. } else if(T[i][j]) // daca aceasta muchie deja a fost introdusa { cout << "Ati introdus deja aceasta muchie.Incercati din nou. } T[i][j] = 1.

grad++.i++) suma+=s[i]. } //------------------------------------------------------------------------------------void CreareCod(int ** T. min++) { grad = 0. int vf) { cout << "\nCodul prufer: ( ". } //------------------------------------------------------------------------------------void afisareCod(int * c.return 0.j<=vf. for(j=1. j <= vf. i++) cout << c[i] << " ".} int ** a = new int* [vf + 1]. i <=vf-2. int suma=0. for(int i = 1. x++) { // 1.} return 1. } .j++) a[i][j]=T[i][j]. for(min = 1. x <= vf-2. int vf) { int min. adj.i<=vf. if(suma!=vf){cout<<"Graful nu este conex. for(int x = 1. for(int j = 1. min <= vf. deci nu este arbore"<<endl. int * c.1. for(i=1.i<=vf.i++) {a[i] = new int[vf + 1]. for(i=1. } df_r(a. cout << ")\n". gaseste varful de grad I cu valoarea cea mai mica int grad. j++)//calculam gradul fiecarui varf pana gasim unul care sa aiba gradul I if(T[min][j]!=0) { adj = j. vf).

T[j][min] = 0. Repeta pana cand mai raman doua varfuri } } //------------------------------------------------------------------------------------void af_arbore(int ** T. j <= vf. i++) { T1[i] = new int[vf + 1]. for(int j = 1. i <= vf. j++) T1[i][j] = 0. int vf = GetInteger("\nDati numarul de varfuri: ". i++) { for(j = i+1. int i. . } // 3.j. for(i = 1. face varful adiacent urmatorul varf din vectorul cod c[x] = adj. } // 2."). int vf) {cout<<endl<<"afisare arbore"<<endl. } //------------------------------------------------------------------------------------int main() {int i.if(grad == 1) break. int ** T1 = new int* [vf + 1]. "Doar arborii cu cel putin 3 varfuri au cod Prufer. j <= vf. for( i = 1. INT_MAX. } cout << endl. j++) { T[min][j] = 0. j <= vf. for(int j = 1. i <= vf . 3. j++) if(T[i][j])cout<<i<<" "<<j<<endl.

} //------------------------------------------------------------------------------------//------------------------------------------------------------------------------------- . system("pause"). vf). CreareCod(T1. int ok=GetTree(T1.} af_arbore(T1. i < vf. int * c = new int[vf].}. vf). return 0. vf). delete []T1. if(ok==0) {system("pause"). i++) c[i] = 0. for(i = 0. vf). return 0. afisareCod(c. c.