Sunteți pe pagina 1din 4

Algoritmul Roy-Warshall

a[i][j]=max(a[i][j],min(a[i][k],a[k][j]))

0 1 1 1
 
1 0 0 0
A ,
1 0 0 1
 
1 0 1 0 

k=0;

i=0;

j=0;

a[i][j]=max(a[i][j],min(a[i][k],a[k][j]))=>a[0][0]=max(a[0][0],min(a[0][0],a[0][0]))=0

j=1

a[0][1]=max(a[0][1],min(a[0][0],a[0][1]))=1

j=2

a[0][2]=1;

j=3

a[0][3]=1;

i=1

j=0

a[1][0]=1;

a[1][1]=0;

a[1][1]=max(a[1][1], min(a[1][0],a[0][1]))=1

a[1][2]=0

a[1][2]=max(a[1][2],min(a[1][0],a[0][2]))=1

……………………………………………………………………………….
0 1 1 1 0 1 1 1
   
1 0 0 0 2 1 1 1 1
A , A 
1 0 0 1 1 1 1 1
   
1 0 1 0  1 1 1 1
 

k=1;

i=0;

j=0;

a[i][j]=max(a[i][j],min(a[i][k],a[k][j]))=>a[0][0]=max(a[0][0],min(a[0][1],a[1][0]))=1

……………………………………………………………………………….

0 1 1 1 0 1 1 1 1 1 1 1 1 1 1 1
       
1 0 0 0 2 1 1 1 1 3 1 1 1 1 1 1 1 1
A , A  , A  , M 
1 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1
       
1 0 1 0  1 1 1 1 1   1 1
   1 1 1 1 1

Scrieți un subprogram care verifică dacă un graf este conex folosind algoritmul Roy-
Warshall. Scrieți un program care demonstrează utilizarea acestui subprogram folosind un
graf preluat dintr-un fișier text (pe prima linie se află numărul de muchii și numărul de
vârfuri ale grafului; pe fiecare din liniile următoare se află câte o pereche de vârfuri
adiacente, în ordine crescătoare – vârfurile sunt identificate prin etichete numerice 𝟏. . 𝒏).

#include<stdio.h>
#include<malloc.h>
int citire(int ***a, int *n)
{ FILE *f;
int j, vf, vi, i, nm,ok=1;
f = fopen("lista.txt", "r");
if (f)
{
fscanf(f, "%d", &*n);
fscanf(f, "%d", &nm);
(*a) = (int**)malloc((*n) * sizeof(int*));
for (i = 0; i < (*n); i++)
*((*a) + i) = (int*)malloc((*n) * sizeof(int));
for (i = 0; i < (*n); i++)
for (j = 0; j < (*n); j++)
(*a)[i][j] = 0;
for (i = 0; i < nm; i++)
{
fscanf(f, "%d", &vi);
fscanf(f, "%d", &vf);
(*a)[vi - 1][vf - 1] = (*a)[vf - 1][vi - 1] = 1;
}
fclose(f);
}
else ok = 0;
return ok;
}
void afisare(int **a, int n)
{
int i, j;
for (i = 0; i < n; i++)
{
for (j = 0; j < n; j++)
printf("%d ", a[i][j]);
printf("\n");
}
}
void Roy_Warshall(int **a, int ***m, int n)
{ int i, j, k;
(*m) = (int**)malloc(n * sizeof(int*));
for (i = 0; i < n; i++)
*((*m) + i) = (int*)malloc(n * sizeof(int));
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
(*m)[i][j] = a[i][j];
for (k = 0; k < n; k++)
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if ((*m)[i][j] == 0) (*m)[i][j] = (*m)[i][k] * (*m)[k][j];
}
void main()
{ int **a, n, **b, **c, i, j, conex=1, ok;
ok=citire(&a, &n);
if (ok == 1)
{
printf("\n Mat. initiala\n");
afisare(a, n);
printf("\nRoy_Warshall varianta 1\n");
Roy_Warshall(a, &b, n);
afisare(b, n);
for (i = 0; i < n; i++)
for (j = 0; j < n; j++)
if (b[i][j] == 0) conex = 0;
if (conex == 1) printf("graful este conex");
else printf("graful nu este conex");
for (i = 0; i < n; i++)
free(a[i]);
free(a);
for (i = 0; i < n; i++)
free(b[i]);
free(b);
}
else printf("fis nu exista");
}
Probleme propuse

Scrieți un subprogram care determină matricea w-distanțelor dintr-un graf. Scrieți un program
care demonstrează utilizarea acestui subprogram folosind un graf preluat dintr-un fișier text (pe
prima linie se află numărul de muchii și numărul de vârfuri ale grafului; pe fiecare din liniile
următoare se află câte o pereche de vârfuri adiacente, în ordine crescătoare, și ponderea muchiei
respective – vârfurile sunt i

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