
#include "graphe.h"
#include "file.h"
#include "file_prio.h"



typedef struct edgenode edgenode;



void parcours_largeur(graph* g,int s){
    
    file* f = fileVide();
    initialize_search(g);
    enfiler(f,s);
    
    while(!est_file_vide(f)){
        
        int x = defiler(f);
        if (!(g->discovered[x])){
            g->discovered[x]=true;
            printf("%d",x);
            edgenode* voisins=g->edges[x];
            while(voisins !=NULL){
                enfiler(f,voisins->y.val);
                voisins=voisins->next;
            }
            
        }
        
    }
    libere(f);
    free(f);


}

int* dijkstra(graph* g,int s){
    heap* f = create_heap(MAXV);
    initialize_search(g);
    insere(s,0,f);
    int* dist = malloc(g->nbvertices*sizeof(int));
  
    for (int i=0;i<g->nbvertices;i++){
        dist[i]=MAXV;
    }
    dist[s]=0;
    while(f->size >0){
        int x = supprime_mini(f).val;
        if (!(g->discovered[x])){
            g->discovered[x]=true;
            edgenode* voisins=g->edges[x];
            while(voisins !=NULL){
                
                if (voisins->y.poids + dist[x] < dist[voisins->y.val]){
                    
                    dist[voisins->y.val]=voisins->y.poids + dist[x];
                    insere(voisins->y.val, voisins->y.poids + dist[x] ,f);
                }
                voisins=voisins->next;
            }
        }
    }
    free(f);
    return dist;
    


}





int main(){
    graph* g = (graph*)malloc(sizeof(graph));
    FILE* f = fopen("exemple.txt","r");
    
    read_graph(f,g);
   
    parcours_largeur(g,0);
    printf("\n");
    int* tab=dijkstra(g,0);
    for (int i=0;i<g->nbvertices;i++){
        printf("%d ",tab[i]);
    }
    free(tab);
    fclose(f);
    free_edges(g);
    free(g);
}
