Algoritmul lui Kruskal

Slides:



Advertisements
Similar presentations
Prof.Briciu Daniela Sc.cu cls. I-VIII Luna de Sus
Advertisements

Adobe photoshop.  De multe ori ne facem fotografii si unele nu le facem publice pentru ca ori am avut un cos in acel moment sau un alt aspect negativ.
Propuneri pentru managementul SPA- urilor in favoarea speciei – m ă suri pentru p ă duri şi m ă suri pentru pajişti Alex Nicoar ă, Tamas Papp „Conservarea.
Z IDURILE SECOLULUI XX Ziduri politice Bariere comerciale Ziduri in domeniul transporturilor Ziduri in zona comunicarii si comunicatiilor.
1 Am pornit in realizarea materialului nostru de la lectiile din manualul de Stiinte ale naturii si din cel de Geografie. 2.
Rezultate si concluzii dupa primele apeluri din 2007 Dana Gheorghe ANCS 8 februarie 2008.
Batalia sexelor O lume dominata de barbati vs o lume dominata de femei.
Caracteristici ale corpurilor cu viata
Present Perfect Continuous prezentare. schema Afirmativ: S + have/has + been + V-ing… Negativ: S + have/has + not + been + V-ing… Interogativ: have/has.
Acum câteva zile, când mă plimbam pe Strada Vieţii am observat un magazin pe care era scris: “ Magazinul Raiului ”.
(passive voice) -prezentare -
Mic îndreptar pentru formulari cotidiene în birou.
POSTA ELECTRONICA Ana-Maria Tache Ioana Cristina Ciufu.
Oracle Academy Lead Adjunct
Funcţii Excel definite de utilizator (FDU) în VBA
Dispozitive de stocare
IF Clause prezentare.
Despre Topologie Ciprian Manolescu UCLA
Structura pipeline a unui procesor MIPS
Şomerul…..
Paxos Made Simple Autor: Puşcaş Radu George
Gindeste ……...
Primirea si procesarea cererilor
CURSUL 4 ECONOMETRIE TESTUL HI PATRAT.
Retele de calculatoare
Sistemul de salarizare pentru funcţionarii publici şi cele mai recente tendinţe ale reformei Germania.
Past Simple prezentare.
Reflexia luminii.
METODA BACKTRACKING Examenul de bacalaureat 2012
Cursul 3 Cautare peste siruri problema cautarea naiva
Generarea modelelor fractale
CONVERSII INTRE SISTEME DE NUMERATIE
Recapitulare La Logica si argumentare
WebSite Social Tema 2 WebSite Social.
Traversarea grafurilor. Aplicaţii
Problema rucsacului lacom
Tipuri structurate Tipul tablou
SUBNETAREA.
Grasu leonard ionut Trifu gabriel
Conferința Națională de Risk Management
Web Form BuilDer Coffee Cup.
Curs 6: Introducere în programarea SAS
Totul despre: Valentine’s day.
original creator unknown
Algoritm de crawling optimizat pe similaritate în documente HTML
Formatarea paragrafului
Funcții C/C++ continuare
prof. mrd. Negrilescu Nicolae Colegiul National Vlaicu Voda
Past Perfect Simple prezentare.
Gindeste ……...
original creator: unknown
INTERNET SERVICII INTERNET.
Eclipsele de soare si de luna
Forms (Formulare).
original creator unknown
A great way to create a channel of communication
SUBSTANTE PURE SI AMESTECURI DE SUBSTANTE
Functia de documentare
Raspunsul la frecventa
Administrarea reţelelor de calculatoare
Gindeste ……...
Programarea in limbajul Java 2004 Lecturer: Gavrila Cristian
Software open source in industria software
PARE IMPOSIBIL! GENERALUL DWIGHT D. EISENHOWER A AVUT
Crearea unei aplicatii Windows Forms simple
Configurarea metodelor de management al calităţii în sectorul public
Implementarea listelor simplu inlantuite
De unde vine; în ce se transformă
Despre lamaie.net De ce sunt lamaile acre? Realizatori: Cristina Cazan
ALGORITMI ŞI SCHEME LOGICE
Presentation transcript:

Algoritmul lui Kruskal Proiect realizat de: Capota Alina si Predescu Iulia

Cuprins: Descrierea algoritmului Implementarea algoritmului Aplicatie practica Exemplu Programul in C++

Descrierea Algorimului Algoritmul lui Kruskal, scris de Joseph Kruskal în 1956, este un algoritm în teoria grafurilor care găseşte arborele parţial de cost minim pentru un graf conex ponderat (graf in care fiecare muchie are asociat un cost). Cu alte cuvinte, găseşte submulţimea muchiilor care formează un arbore care include toate vârfurile şi care este minimizat din punct de vedere al costului. Dacă graful nu este conex, atunci algoritmul găseşte un arbore parţial de cost minim pentru fiecare componentă conexă. Algoritmul lui Kruskal este un exemplu de algoritm greedy.

Implementarea algoritmului Pentru implementarea algoritmului este necesară rezolvarea următoarelor două probleme:        – cum extragem muchia de cost minim       – cum testăm dacă muchia selectată formează sau nu cicluri cu cele deja selectate. Pentru a extrage minimul, o idee ar fi să sortăm muchiile crescător după cost şi să parcurgem secvenţial muchiile ordonate. Pentru a realiza sortarea muchiilor grafului, vom reprezenta graful prin lista muchiilor (un vector cu m componente, fiecare componentă fiind o structură în care reţinem cele două extremităţi şi costul muchiei). O muchie va forma cicluri cu muchiile deja selectate dacă şi numai dacă între extremităţile muchiei există cel puţin un lanţ. Pentru a testa dacă o muchie formează cicluri cu muchiile deja selectate este suficient să testăm dacă extremităţile muchiei se găsesc în aceeaşi componentă conexă. Pentru aceasta va trebui să ţinem permanent evidenţa componentelor conexe (arborilor) care se formează.

Reprezentarea informaţiilor: n – numărul de vârfuri m – numărul de muchii din graf G – graful dat, reprezentat prin lista muchiilor (un vector cu m componente, fiecare componentă fiind o structură în care reţinem cele două extremităţi şi costul muchiei) A – arborele parţial de cost minim, reprezentat ca un vector n-1 componente în care vom reţine indicii din G ai muchiilor selectate c – vector cu n componente în care vom reţine evidenţa componentelor conexe (c[i] = componenta conexă căreia îi aparţine vârful i)

Aplicatie Practica Trebuie sa conectam 3 orase la o retea telefonica: Bucuresti, Timisoara si Arad. Necesar cablu: 1300 km. 640 60 600

E inutil sa executam toate cele trei conexiuni, numai doua din ele sunt suficiente pentru o comunicare in bune conditii intre oricare 2 orase. De exemplu, legatura Timisoara – Arad ar putea lipsi, caz in care necesarul de cablu devine 1240 km. 640 600

Sau legatura Timisoara – Bucuresti ar putea lipsi, necesarul de cablu devenind 700 km. 640 60

Oricare 2 legaturi sunt suficiente, deoarece semnalul electric circula suficient de rapid ca un abonat din Timisoara care doreste sa vorbeasca cu unul din Arad (de exemplu) sa nu-si dea seama ca nu exista legatura directa intre Timisoara si Arad si ca apelul sau este rutat prin Bucuresti. Din punctul de vedere al necesarului de cablu, lucrurile nu mai stau la fel. Conteaza foarte mult care legaturi vor fi realizate si care nu. Cel mai ieftin ar fi sa alegem legaturile Arad – Timisoara si Timisoara – Bucuresti si sa evitam legatura Arad - Bucuresti, necesarul de cablu ajungand in acest caz la 660 km; aceasta este situatia optima – sau “acoperirea minima” a retelei.

Exemplu: Notăm cu n numărul de vârfuri din graf (n=|X|). Iniţial considerăm că nici o muchie din graf nu a fost selectată, deci fiecare vârf din graf este vârf izolat. Cu alte cuvinte, la momentul iniţial avem o pădure formată din n arbori, fiecare arbore fiind format dintr-un singur vârf.  La fiecare pas se selectează o muchie de cost minim care nu a mai fost selectată şi care nu formează cicluri cu muchiile deja selectate. 2 111 3 111 1 2 3 1 111 4 1 1 111 4 111 5

Pasul 1:Selectăm o muchie de cost minim. (În cazul nostru, de cost 1) Pasul 1:Selectăm o muchie de cost minim. (În cazul nostru, de cost 1).Observaţi că în graful parţial selectat există n - 1 = 4 arbori, pentru că am unificat arborii corespunzători extremităţilor muchiei selectate. Arborii sunt: { 1, 3 }; { 2 }; { 4 }; { 5 }. Pasul 2: Selectăm din nou o muchie de cost minim.(Costul minim fiind 1).Observaţi că în graful parţial selectat există n - 2 = 3 arbori. Arborii sunt:{ 1, 3, 4 }; { 2 }; { 5 }. Pasul 3: La acest pas nu mai putem selecta o muchie de cost 1, deoarece s-ar obţine un ciclu. Selectăm muchia de cost 2.Arborii sunt: { 1, 2, 3, 4 }; { 5 }. Pasul 4: Selectând, în final, muchia de cost 3, obţinem un graf fără cicluri cu n-1 muchii, deci un arbore.

#include<fstream> #include<iostream> using namespace std; int n,nr_muchii,k=1,T[50],H[50],M[3][50]; void citire() {     ifstream f("graf.in");     f>>n;     while(f>>M[0][k]>>M[1][k]>>M[2][k])     k++; } int Arb(int nod) {     while(T[nod])     nod=T[nod];     return nod; } int main() {     citire();     k=1;     do     {while(Arb(M[0][k])==Arb(M[1][k]))     k++;     nr_muchii++;     cout<<M[0][k]<<" "<<M[1][k]<<" "<<M[2][k]<<endl;     if(H[M[0][k]]== H[M[1][k]])     {T[M[0][k]]==M[1][k];     H[M[1][k]]++;     }     else     if(H[M[0][k]<H[M[1][k]])     T[M[0][k]]=M[1][k];     else     T[M[1][k]]=M[0][k];     k++;     }     while(nr_muchii<n-1);     return 0; } Cod C++: