You are on page 1of 2

#include<stdio.

h>
#include<stdlib.h>
#define N 6
#define INF 10000
void print_distance(int [],int);
void Dijkstra(int [][N],int); //Dijkstra brze konvergira, ima samo pozitivne veze,
pohlepan je, //ne pamti cvorove preko kojih ide, samo za neusmjerene
int minD(int d[],int Q[]);//vraca indeks cvora koji je najmanje udaljen od
odredenog // cvora
int main()
{
int G[N][N]={{0,4,INF,2,INF,INF},{4,0,5,1,INF,INF},{INF,5,0,8,2,6},
{2,1,8,0,10,INF},{INF,INF,2,10,0,3},{INF,INF,6,INF,3,0}};
int n,i,j,s;

printf("\n Graf u obliku matrice tezina\n");


for(i=0;i<N;i++)
{
for(j=0;j<N;j++)
{
if(G[i][j]==10000) printf("INF\t");
else printf("%d\t", G[i][j]);

}
printf("\n");
}

printf("\n Unesite source cvor:[1,6]: ");


scanf("%d",&s);

Dijkstra(G,s-1);
return 0;

void print_distance(int d[],int s)


{
printf("Najkrace udaljenosti cvorova od source cvora %d\n",s+1);
for (int i = 0; i < N; i++)
printf("Cvor %d \t\t udaljenost=%d\n", i+1, d[i]);
}

int minD(int d[],int Q[])


{
int min=INF,min_index;

for (int i=0;i<N;i++)


if (Q[i] == 0 && d[i] <= min) //ako je Q neobraden i d<10 000
min=d[i], min_index=i;

return min_index;
}
void Dijkstra(int G[N][N], int s)
{
int d[N],pret[N];//d[N]=niz udaljenosti svakog �vorova od source �vora,
//pret[N]=prethodnici(za rekonstrukciju najkra�eg puta
//d[i] �e sadr�avati najkracu udaljenost od source �vora do i
int i, j;
//inicijalizacija
int Q[N]={0};//Q=niz neobradenih �vorova,�lanovi inicijalizirani na nulu
int q;//q=izabrani �vor, po�injemo sa source �vorom
for(i=0;i<N;i++){
if(i!=s){
d[i]=INF;
pret[i]=-1;
}
}
d[s]=0;//udaljenost source cvora od sebe samog = 0

for (i=0;i<N-1;i++)
{
// izaberemo cvor s najmanjom udaljenoscu(koji jos nije obraden)
//u prvoj iteraciji uzimamo cvor s(source cvor)
q=minD(d,Q); //vraca manju vrijednost od ove dvije

Q[q]=1;//oznacavamo da je cvor q obraden


for (j= 0; j< N; j++)//idemo po svim cvorovima susjednim odabranom
cvoru
if (!Q[j] && G[q][j]!=0 && d[q]!= INF)//ako grana postoji i susjedni
//cvor nije obraden
if(d[q] + G[q][j] < d[j])
{
d[j] = d[q] + G[q][j];//relaksacija ako je put od s do v preko
q //kraci od puta od s do v
pret[j]=q;
}

print_distance(d,s);
}

Primjer rada algoritma za mre�u:

Graf u obliku matrice tezina


0 4 INF 2 INF INF
4 0 5 1 INF INF
INF 5 0 8 2 6
2 1 8 0 10 INF
INF INF 2 10 0 3
INF INF 6 INF 3 0

Unesite source cvor:[1,6]: 1


Najkrace udaljenosti cvorova od source cvora 1
Cvor 1 udaljenost=0
Cvor 2 udaljenost=3
Cvor 3 udaljenost=8
Cvor 4 udaljenost=2
Cvor 5 udaljenost=10
Cvor 6 udaljenost=13
Press any key to continue . . .

You might also like