Napisz w języku C program liczący długości najkrótszych dróg w grafie
na podstawie algorytmu Floyda-Warshalla. Program na standardowym wejściu
otrzymuje liczbę wierzchołkow n, a następnie n2 liczb całkowitych oznaczających
długości krawędzi łaczących wierzchołki: nieujemna liczba jest długością
krawędzi, ujemna oznacza brak krawędzi (brak połączenia pomiędzy punktami).
Program (programy) ma (mają) wykorzystywać do obliczeń (przynajmniej) dwa procesy.
Główny program ma wywoływać inny (inne) program (programy) (lub swoją kopię)
przekazując potrzebne dane w liście argumentów (wielkość tablicy).
Do obliczen uzywam algorytmu Floyda.
mam na razie tyle i nie wiem co dalej??
# include <stdio.h>
# include <unistd.h>
# include <sys/sem.h>
# include <sys/types.h>
# include <sys/ipc.h>
# include <sys/shm.h>
# include <stdlib.h>
# define n 6
union semun{
int val ;
ushort *array ;
struct semid_ds info ;
} ;
int main()
{
//SEMAFORY I PAMIEC WSPOLNA
int semid ;
int *d ;
struct sembuf buf ;
union semun arg ;
int id ;
int k, i, j, n1 ;
n1 = (int)n/2 ;
key_t key = ftok("/tmp", 23) ;
printf("klucz =%d\n", key) ;
if( (id = shmget(key, sizeof(int)*6, IPC_CREAT|0600)) == -1)
perror("Blad utworzenia pamiec wspolnej\n") ;
printf("id = %d\n", id) ;
//utworzenie, zainicjowanie
key_t key2 = ftok("/var", 45) ;
if( (semid = semget(key2, 1, IPC_CREAT|0600)) == -1)
perror("Blad utworzenia semafora\n") ;
printf("semid = %d\n", semid) ;
arg.val = 1 ;
if( semctl(semid, 0, SETVAL, arg) == -1 ) // ustawiam semafor na 1
perror("Blad ustawienia pola semval\n") ;
if( fork() == 0) //proces potomny
{
// ALGORYTM FLOYDA - WARSHALLA
d = shmat(id, NULL, 0) ;
for (k = 0; k < n; k++) {
for (i = 0; i < n ; i++)
for (j = 0; j < n; j++)
{
buf.sem_num = 0 ;
buf.sem_op = -1 ;
buf.sem_flg = 0 ;
semop(semid, &buf, 1) ;
if (d[i*n+k] >= 0 && d[k*n+j] >= 0
&& (d[i*n+k] + d[k*n+j] < d[i*n+j]
|| d[i*n+j] < 0))
d[i*n+j] = d[i*n+k] + d[k*n+j];
}
buf.sem_num = 0 ;
buf.sem_op = 1 ;
buf.sem_flg = 0 ;
semop(semid, &buf, 1) ;
}
shmdt(d) ;
exit(0) ;
}
//proces macierzysty
d = shmat(id, NULL, 0) ;
for (k = 0; k < n; k++) {
for (i = n1; i < n; i++)
for (j = 0; j < n; j++)
{
buf.sem_num = 0 ;
buf.sem_op = -1 ;
buf.sem_flg = 0 ;
semop(semid, &buf, 1) ;
if (d[i*n+k] >= 0 && d[k*n+j] >= 0
&& (d[i*n+k] + d[k*n+j] < d[i*n+j]
|| d[i*n+j] < 0))
d[i*n+j] = d[i*n+k] + d[k*n+j];
}
buf.sem_num = 0 ;
buf.sem_op = 1 ;
buf.sem_flg = 0 ;
semop(semid, &buf, 1) ;
}
shmdt(d) ;
exit(0) ;
}