ALGORITMUL LUI PRIM PREZENTAREA ALGORITMULUI Algoritmul lui Prim

  • Slides: 17
Download presentation
ALGORITMUL LUI PRIM

ALGORITMUL LUI PRIM

PREZENTAREA ALGORITMULUI Algoritmul lui Prim este un algoritm din teoria grafurilor care găsește arborele

PREZENTAREA ALGORITMULUI Algoritmul lui Prim este un algoritm din teoria grafurilor care găsește arborele parțial de cost minim al unui graf conex ponderat. Înseamnă găsirea submulțimei muchiilor care formează un arbore ce include toate vârfurile și al cărui cost este minim. Pasul 1: - se alege un vârf de start (x); - se marchează vârful ȋntr-un vector viz, ȋn care vedem nodurile prin care am trecut (viz[x]=1); - se inițializează vectorul s astfel : s[x]=0, s[i]=x (pentru i!=x ); → la final, vectorul s va reprezenta și vectorul de tați; Pasul 2: - se alege muchia de cost minim cu un capăt selectat; - se marchează capătul neselectat; - se actualizează vectorii viz și s; - se reia pasul 2 de n-2 ori (n fiind numărul de noduri din graf) ;

EXEMPLU Pentru graful următor se va aplica Algoritmul lui Prim, plecând din nodul 6,

EXEMPLU Pentru graful următor se va aplica Algoritmul lui Prim, plecând din nodul 6, iar la sfârșit se va afișa arborele rezultat. s: 6 6 6 0 6 6 6 1 2 3 4 5 6 7 8 9 10 11 viz: 0 0 0 0 0 1 2 3 4 5 6 7 8 9 10 11 Prezentarea Algoritmului

s: 5 5 6 0 6 6 6 1 2 3 4 5 6

s: 5 5 6 0 6 6 6 1 2 3 4 5 6 7 8 9 10 11 viz: 0 0 1 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 5 1 5 6 0 6 6 6 1 2 3 4

s: 5 5 1 5 6 0 6 6 6 1 2 3 4 5 6 7 8 9 10 11 viz: 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 6 3 6 6 6 1 2

s: 5 3 1 5 6 0 6 3 6 6 6 1 2 3 4 5 6 7 8 9 10 11 viz: 1 0 1 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 6 3 8 6 8 1 2

s: 5 3 1 5 6 0 6 3 8 6 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 0 1 1 0 0 0 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 6 3 11 11 8 1 2

s: 5 3 1 5 6 0 6 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 0 1 1 0 0 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 6 3 11 11 8 1 2

s: 5 3 1 5 6 0 6 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 0 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 6 3 11 11 8 1 2

s: 5 3 1 5 6 0 6 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 1 1 0 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 5 6 0 10 3 11 11 8 1 2

s: 5 3 1 5 6 0 10 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 1 1 0 1 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 7 6 0 10 3 11 11 8 1 2

s: 5 3 1 7 6 0 10 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 1 1 0 1 1 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

s: 5 3 1 7 6 0 10 3 11 11 8 1 2

s: 5 3 1 7 6 0 10 3 11 11 8 1 2 3 4 5 6 7 8 9 10 11 viz: 1 1 1 2 3 4 5 6 7 8 9 10 11 Prima Pagină a Exemplului

Arborele de cost minim, cu rădăcina 6, este cel din figura de mai jos.

Arborele de cost minim, cu rădăcina 6, este cel din figura de mai jos. Prima Pagină a Exemplului

AI GRESIT NODUL ALES. INCEARCĂ DIN NOU. Alege nodul pe care l-ai ales ȋnainte

AI GRESIT NODUL ALES. INCEARCĂ DIN NOU. Alege nodul pe care l-ai ales ȋnainte de cel greșit. 6 5 1 3 8 2 11 9 10 7

CODUL ALGORITMULUI int a[50], s[100], viz[100], oo=4000, n; void Prim(int x) {int i, j,

CODUL ALGORITMULUI int a[50], s[100], viz[100], oo=4000, n; void Prim(int x) {int i, j, p, min, k, c=0; viz[x]=1; for(i=1; i<=n; i++) s[i]=x; s[x]=0; for(k=1; k<=n-1; k++) {min=oo; p=0; for(i=1; i<=n; i++) {if(!viz[i] && min>a[i][s[i]]) {min=a[i][s[i]]; p=i; } viz[p]=1; } for(i=1; i<=n; i++) if(!viz[i] && a[i][s[i]]>a[i][p]) s[i]=p; c=c+min; } cout<<c<<endl; }