algoritma dan struktur data mencari graph dengan metode warshall

     Selamat pagi teman semua ini saya lanjutakan materi berikut nya dari struktur data yaitu tentang graph, apa itu graph graph adalah suatu metode untuk mencari jarak terpendek didalam graph ada sendiri ada banyak cara. Saya kasih contoh menggunakan metode algoritma dari warshall berikut code nya.

code program metode warshall

-----------------------------------------------------------------
#include<stdio.h>
#define m 100

int q[5][5]={{m,1,3,m,m},{m,m,1,m,5},{3,m,m,2,m},{m,m,m,m,1},{m,m,m,m,m}};
int p[5][5]={{0,1,1,0,0},{0,0,1,0,1},{1,0,0,1,0},{0,0,0,0,1},{0,0,0,0,0}};
int r[5][5]={{m,0,0,m,m},{m,m,0,m,0},{0,m,m,0,m},{m,m,m,m,0},{m,m,m,m,m}};
int i, j, k;

void tampilq();
void tampilp();
void tampilr();
void bebanrute();
void jalur();

typedef struct {
int rute[m];
int jml;
}stack;

void inisial(stack *);
void push(int,stack *);
int pop(stack *);
int kosong(stack *);
void rute();

stack tumpukan;

void main()
{
printf("graph - risma afitah\n\n");
printf("matrik awal :\n");
printf("matrik q :\n");
tampilq();
printf("\n\n");
printf("matrik p :\n");
tampilp();
printf("\n\n");
printf("matrik r :\n");
tampilr();

printf("\n");
printf("warshall beban (q) :\n");
bebanrute();
tampilq();
printf("\n");
printf("warshall jalur (p) :\n");
jalur();
tampilp();
printf("\n");
printf("warshall rute (r) :\n");
bebanrute();
tampilr();
rute();
}

void tampilp()
{
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("%d\t", p[i][j]);
}
printf("\n");
}
}

void tampilq()
{
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("%d\t", q[i][j]);
}
printf("\n");
}
}

void tampilr()
{
for(i=0; i<5; i++)
{
for(j=0; j<5; j++)
{
printf("%d\t", r[i][j]);
}
printf("\n");
}
}

void bebanrute()
{
for(k=0; k<5; k++)
for(i=0; i<5; i++)
for(j=0; j<5; j++)
     if((q[i][k]+q[k][j]) < q[i][j])
 {
 q[i][j] = q[i][k]+q[k][j];

 if(r[k][j]==0)
 r[i][j]=k+1;
 else
 r[i][j]=r[k][j];
 }
}

void jalur()
{
for(k=0; k<5; k++)
for(i=0; i<5; i++)
for(j=0; j<5; j++)
p[i][j]=(p[i][j]) || (p[i][k] && p[k][j]);
}

void inisial(stack *s)
{
s->jml = 0;
}

void push(int y, stack *s)
{
s->rute[s->jml] = y;
(s->jml)++;
}

int pop(stack *s)
{
int temp;

if(kosong(s))
{
puts("stack kosong");
temp = ' ';
return temp;
}
else
{
(s->jml)--;
temp = s->rute[s->jml];
return temp;
}
}

int kosong(stack *s)
{
if(s->jml == 0)
return 1;
else
return 0;
}

void rute()
{
int asal, tujuan, tujuan2, tmp, x;

printf("\nmasukkan asal : ");
scanf("%d", &asal);
printf("masukkan tujuan : ");
scanf("%d", &tujuan);

tujuan2=tujuan;
inisial(&tumpukan);

do
{
tmp=r[asal-1][tujuan-1];
if(tmp==m)
{
printf("tidak ada rute");
break;
}

if(tmp!=0)
{
push(tmp,&tumpukan);
tujuan=tmp;
}
}
while(tmp!=0);

printf("rute dari %d ke %d adalah : ", asal, tujuan2);
printf("%d - ", asal);

while(!kosong(&tumpukan))
{
x=pop(&tumpukan);
printf("%d - ", x);
}

printf("%d\n", tujuan2);
if(q[asal-1][tujuan2-1]==100)
{
printf("tidak ada beban");
//break;
}
else
{
printf("total beban = %d", q[asal-1][tujuan2-1]);
}
}

-----------------------------------------------------------------

untuk output programnya silakan di coba sendiri dulu nanti outpunya bagaimana, jangan lupa gunakan compiler c nya. Semoga bermanfaat sedikit ilmu ku ini amin.