Documente online.
Zona de administrare documente. Fisierele tale
Am uitat parola x Creaza cont nou
 HomeExploreaza
upload
Upload




Se da un graf G precizat prin multimea nodurilor si multimea arcelor sale, folosind ca implementare implementarea prin matrice de adiacenta varianta a II-a

c


Se da un graf G precizat prin multimea nodurilor si multimea arcelor sale, folosind ca implementare implementarea prin matrice de adiacenta varianta a II-a. Sa se determine intre care doua noduri ale grafului exista drum. Se va afisa atat matricea de adiacenta, c 717f58h at si matricea drumurilor! (Warshall).



Descrierea algoritmului

Warshall a fost cel care a determinat un algoritm mai eficient pentur calculul inchiderii tranzitive decat cel anterior. In acest sens ne declaram o matrice Drumk astfel incat Drumk[i,j] == 1 daca exista un drum de la nodul i la nodul j care nu trece prin nici un alt nod cu numarul > k, exceptamd eventual nodurile is si j. Subintelegem ca am denumit nodurile 1, 2, , n. k poate lua valori de la 0 la nrnoduri.

Drum0[i,j] este matricea care are e pozitia ij true (daca exista un drum de la i la j care nu trece prin nici un nod > 0, cu exceptia lui i si j. Deci Drum0[i,j]==Arce[i,j], deoarece singura posibilitate de a ajunge de al i la j este calea directa de la i la j, adica arcul(i,j).

Ne propunem sa determinam Drumk+1[i,j] pornind de la Drumk. Evident Drumk[i,j]==1 acolo unde Drumk[i,j]=1, deoarece, daca avem un drum de la i la j care nu trece prin nici un nod cu numarul > k, vom avea drum de la i la j care nu trece prin nici un nod cu numarul > k+1.

Singura posibilitate ca Drumk+1[i,j]==1 di Drumk[i,j]==0 este daca exista un drum de la i la jprin nodul k+1, care insa sa treaca numai prin nodurile de al 1 la k. Deci vom avea un drum de la nodul i la nodul k+1 care nu trece prin nici un nod cu indice > k.

Cu alte cuvinte, Drumk+1[i,j] == 1 daca:

Drumk[i,j] == 1 sau

Drumk[i,k+1] == 1 si Drumk[k+1,j] == 1 .

=>Drumk+1[i,j] == Drumk[i,j] || (Drumk[i,k+1] && Drumk[k+1,j] ) .

Conform acestui algoritm Drum0 == Arce si Drumnrnoduri == Drum deci chiar matricea inchiderii tranzitive cautata .

Observatii:

Algoritmul lui Warshall , care determina matricea Drumnrnoduri determina chiar matricea Drum , doar ca algoritmul este de ordinul n3 , unde n coincide cu numarul de noduri ale grafului .

Rezolvare:

Se da un graf G precizat prin multimea nodurilor si multimea arcelor sale, folosind ca implementare implementarea prin matrice de adiacenta varianta a II-a. Sa se determine intre care doua noduri ale grafului exista drum. Se va afisa atat matricea de adiacenta, c 717f58h at si matricea drumurilor! (Warshall).

#include<stdio.h>

#include<graphics.h>

#include<alloc.h>

#include<conio.h>

#include<dos.h>

#include<ctype.h>

#include<stdlib.h>

#include<math.h>

#define R 200

#define r 15

#define maxN 20

#define PI M_PI

typedef char TipCheie;

typedef TipCheie TipEl;

typedef int TipContor;

typedef TipEl TipTabEl[maxN];

typedef int TipMatAdi[maxN][maxN];

typedef struct

graf;

typedef struct

TipArc;

graf g;

TipEl e,c1,c2;

TipMatAdi Drum;

int c,x0,y0,xi,yi,xj,yj;

double x1,y1,x2,y2,x3,y3,alfa,alfa1,alfa2;

int IndiceNod;

TipArc IndiceArc;

int i,j;

char s[2]=;

void init_mod_grafic(void)

}/*init mod_grafic*/

int Cauta(graf g, TipCheie cheia)

void InserArc(graf *g, TipArc IndiceArc)

/*InserArc*/

void InserNod(graf *g, TipEl e)

g->Arce[g->Contor-1][g->Contor-1]=1;

void DesenareNoduri(int n)

setcolor(WHITE);

}/*DesenareNoduri*/

void TraseazaArc(int i, int j)

void InserareArc(void)

else printf('al doilea nod eronat!g.Contor');

}

else printf('primul nod eronat!g.Contor');

} /*InserareArc*/

void CreareGraf(void)

/*precizare multimilor arcelor*/

if(g.Contor>0)

/*while*/

}

} /*CreareGraf*/

void SuprimareArc(void)

else printf('al doilea nod eronat!g.Contor');

}

else printf('primul nod eronat!g.Contor');

}/*SuprimareArc*/

void DesenareGraf(void)

setcolor(WHITE);

} /*DesenareGraf*/

void Atribuire(TipMatAdi a,TipMatAdi b)

//atribuire

void AfisMat(TipMatAdi a)

}//afisare matrice

void Warshall(TipMatAdi Adi,TipMatAdi Drum)

void main()

clrscr();

closegraph();

init_mod_grafic();

x0=getmaxx()/2+80;

y0=getmaxy()/2;

printf('C - Crearen');

printf('A - InserareArcn');

printf('S - SuprimareArcn');

printf('N - InserareNodn');

printf('D - SuprimareNodn');

printf('T - Afisare matrice drumn');

printf('E - iesiren');

printf('Introduceti op: ');

fflush(stdin); scanf('%c',&op); op=toupper(op);

cleardevice();

}

closegraph();



Document Info


Accesari: 371
Apreciat: hand-up

Comenteaza documentul:

Nu esti inregistrat
Trebuie sa fii utilizator inregistrat pentru a putea comenta


Creaza cont nou

A fost util?

Daca documentul a fost util si crezi ca merita
sa adaugi un link catre el la tine in site


in pagina web a site-ului tau.




eCoduri.com - coduri postale, contabile, CAEN sau bancare

Politica de confidentialitate | Termenii si conditii de utilizare




Copyright © Contact (SCRIGROUP Int. 2024 )