Sunteți pe pagina 1din 2

WARSHALL Din matricea de adiacen, obinem matricea drumurilor prin prelucrri succesive.

Intre dou noduri I i j ntre care nu exist arc direct, se poate obine un drum printr-un nod intermediar, notat k. adic unde nu am arc (a*i+*j+==0) caut arc a*i+*k+ i a[k+*j+, echivalent cu operaia de nmulire. Plec de la matricea de adiacen a grafului i pentru toate perechile de valori (I, j, k) i a*i+*j+==0 scriu pe foaie ct face a[i][k]* a[k][j]. Matricea va trece prin 4 transformri, pe care le-am trecut n fiierul drumuri.txt. Matricea drumurilor spune dac exist drum ntre dou vfuri I i j. ROY-WARSHALL Determin drumurile minime ntre oricare dou vrfuri (i,j). pentru asta graful este definit prin matricea costurilor, unde pot s am: costul muchiei dac muchia exist, 0 pe diagonal, infinit dac muchia nu exist. Algoritmul este n caiet. Se vor determin costurile minime ale drumurilor, dac gsesc un nod k, astfel nct a*i+*j+<a*i+*k++a*k+*j+. Intre dou noduri unde nu este arc (adic infinit) poate aprea un drum de cost mai mic prin intermediul nodului k. Se iau costuri n loc de 1, se pune 0 pe diagonala principal i se definete const int inf=1000 pentru ceilali de 0. Vom urmri, similar, transformrile matricei. #include<fstream.h> #include<iostream.h> int a[10][10],n; ifstream f ("graf.txt"); ofstream g ("drumuri.txt"); void citire() { f>>n; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) f>>a[i][j]; } void scriere() { for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) g<<a[i][j]<<" "; g<<endl; } g<<endl; } void warshall() { for (int k=1;k<=n;k++) {for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i!=k && j!=k && a[i][j]==0) a[i][j]=a[i][k]*a[k][j]; scriere();} } int main() { citire(); warshall(); f.close();g.close(); return 0; }

#include<fstream.h> #include<iostream.h> const int inf=1000; int a[10][10],n; ifstream f ("graf.txt"); ofstream g ("drumuri.txt"); void citire() { f>>n; for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) { f>>a[i][j]; if (a[i][j]==0 && i!=j) a[i][j]=inf;} } void scriere() { for (int i=1;i<=n;i++) { for (int j=1;j<=n;j++) if (a[i][j]==inf) g<<"- "; else g<<a[i][j]<<" "; g<<endl; } g<<endl; } void warshall() { for (int k=1;k<=n;k++) {for (int i=1;i<=n;i++) for (int j=1;j<=n;j++) if (i!=k && j!=k && a[i][j]>a[i][k]*a[k][j]) a[i][j]=a[i][k]+a[k][j]; scriere();} } int main() { citire(); warshall(); f.close();g.close(); return 0; } Am pus infinit i pe diagonala principal i atunci au ieit i circuitele.

S-ar putea să vă placă și