#include "bellman.h"


/* La fonction suivante permet de vérifier que le graphe a été saisi 
correctement. Elle liste pour chaque sommet ses "pères" assortis 
des longueurs de l'arc correspondant*/
void ecritListes(void); 


/***********************   fonction construire     ***********
  La fonction lire ouvre le fichier dont le nom est indiqué en 
  paramètre puis y lit,  d'abord l'ordre du graphe, puis la liste 
  des arcs codés sous la forme (origine, extrémité, longueur).
  La fonction DOIT ALLOUER la place en mémoire pour le tableau 
  graphe et doit construire les chaînes de pères.
  Exemple : le graphe ayant trois sommets, dont les noms sont 0, 1 et 2, 
  l'arc (0,1) de poids 5.2 et l'arc (2,0) de poids -3 sera décrit ainsi 
  dans un fichier : 
  3
  0 1 5.2
  2 0 -3 
  La fonction ferme le fichier qu'elle a ouvert.
*/
void construire(char * nomFichier)
{
  FILE * fichier;
  PERE * adrPere;
  int nomSommet;
  int i;

  fichier = fopen(nomFichier, "r");
  if (fichier == NULL)
    {
      printf("le fichier indique n'existe pas\n");
	  system("PAUSE");
      exit(1);
    }
  fscanf(fichier, "%d", &ordre);
  graphe = (PERE **) malloc(ordre * sizeof(PERE *));
  if (graphe == NULL)
    {
      printf("manque de place\n");
	  system("PAUSE");
      exit(1);
    }
  for (i = 0; i < ordre; i++) graphe[i] = NULL;
  while (!feof(fichier))
  {
      adrPere = (PERE *) malloc(sizeof(PERE));
      if (adrPere == NULL)
	{
	  printf("manque de place\n");
	  system("PAUSE");
	  exit(1);
	}
      fscanf(fichier, "%d", &adrPere->nomPere);
      if ((fscanf(fichier, "%d", &nomSommet) == EOF) ||
	  (fscanf(fichier, "%d", &adrPere->longueur) == EOF))
	{
	  printf("probleme avec le fichier\n");
	  system("PAUSE");
	  exit(1);
	}
      adrPere->suivant = graphe[nomSommet];
      graphe[nomSommet] = adrPere;
    }
  fclose(fichier);
  ecritListes();  /* cette instruction n'est utile que 
		     pour la période de tests */
}
/***********      Fin de la fonction construire      ********/

/* La fonction suivante permet de vérifier que le graphe a été saisi 
correctement. Elle liste pour chaque sommet ses "pères" assortis 
des longueurs de l'arc correspondant*/
void ecritListes()
{
  char charDepart;
  int i;
  PERE * adrPere;
	printf("\n\n\n");
  for ( i = 0; i < ordre; i++)
    {
      adrPere = graphe[i];
      while (adrPere != NULL)
	{
		if(i==1){
	  tacheDepart=adrPere->nomPere;
	  //printf("\n la tache de depart est : %d \n\n",tacheDepart);
	  charDepart=tacheDepart;
	  }

	  printf("arc (%d, %d)\tde longueur\t%d\n", 
		 adrPere->nomPere, i, adrPere->longueur);

	  adrPere = adrPere->suivant;
	}
	}
	derniereTache = i-1;
	printf("\nla tache de depart est : %d \n",charDepart);
	printf("la derniere tache est : %d\n\n",derniereTache);
    
  printf("\n");
}

