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) ;

}