Laborator 9

GRAFURI ORIENTATE

Fisierul graf.txt:

8

A B C D E F G H

0 9 1 3 999 999 9 999

999 0 999 999 999 999 999 999

999 999 0 999 2 5 999 999

999 999 999 0 999 999 5 999

999 4 999 999 0 1 999 999

999 999 999 999 999 0 1 999

999 999 999 999 999 999 0 999

999 999 999 1 999 4 2 0

#include <iostream>

#include <fstream>

#include <limits>

#define MAX 100

using namespace std;

int infinit = 999;

int numarNoduri;

int matriceAdiacenta[MAX][MAX];

char vector[MAX];

void citire()

{

ifstream f("graf.txt");

int i,j;

f>>numarNoduri;

for(i=1;i<=numarNoduri;i++)

f>>vector[i];

for(i=1;i<=numarNoduri;i++)

for(j=1;j<=numarNoduri;j++)

f>>matriceAdiacenta[i][j];

f.close();

}

void afisareMatrice()

{

int i,j;

for(i=1;i<=numarNoduri;i++)

{

for(j=1;j<=numarNoduri;j++)

cout<<matriceAdiacenta[i][j]<<" ";

cout<<endl;

}

}

void dijkstra(int nodInitial)

{

int i,j,min,k;

bool ok;

int vizitat[MAX]={0},distanta[MAX];

for (i=1;i<=numarNoduri; i++)

{

distanta[i]=matriceAdiacenta[nodInitial][i];

vizitat[i]=0;

}

vizitat[nodInitial]=1;

ok=true;

while(ok)

{

min=infinit;

for(i=1;i<=numarNoduri;i++)

if (!vizitat[i]&&min>distanta[i])

{

min=distanta[i];

k=i;

}

if (min!=infinit)

{

vizitat[k]=1;

for (i=1;i<=numarNoduri;i++)

if (!vizitat[i]&&distanta[i]>distanta[k]+matriceAdiacenta[k][i])

{

distanta[i]=distanta[k]+matriceAdiacenta[k][i];

}

}

else

ok=false;

}

cout<<"Distanta de la nodul initial la celalalte noduri este:";

for(i=1;i<=numarNoduri;i++)

cout<<endl<<distanta[i];

}

int main()

{

cout << "Hello world!" << endl;

citire();

int nodInitial;

cout<<"nodInitial=";cin>>nodInitial;

dijkstra(nodInitial);

return 0;

}