void buscalargura(grafo *G, int s, int *d, int *pai){ //branco=0 cinza=1 preto=2 e nulo=-1 no *q; aresta *p; int cor[G->vertices], u, v; grafo L; q=G->inicio; while(q!=NULL){ cor[q->vertice]=0; d[q->vertice]=-1; pai[q->vertice]=-1; q=q->prox; } cor[s]=1; d[s]=0; L.inicio=NULL; enfila(&L,s); while(L.inicio!=NULL){ u=desenfila(&L); q=buscavertice(G,u); p=q->prox_aresta; while(p!=NULL){ if(cor[p->arestas]==0){ cor[p->arestas]=1; d[p->arestas]=d[u]+1; pai[p->arestas]=u; enfila(&L,p->arestas); } p=p->prox_aresta; } cor[u]=2; } //return d; }
/*Move a primeira posição da fila para a última, retornando o valor do elemento que andou*/ int anda_fila(Fila* noCabeca, Fila* fimFila) { int num; num = desenfila(noCabeca, fimFila); enfila(noCabeca, fimFila, num); return num; }
//avore geradora minima PRIM void algoritimo_prim(grafo *G, int *d, int *pai, int *key){ no *q; aresta *p; grafo Q; define(&Q); int maior, r; maior=buscamaior(G); int weight[maior][maior]; //cria matriz de peso q=G->inicio; r=q->vertice; while(q!=NULL){ if(q->prox_aresta!=NULL){ p=q->prox_aresta; while(p!=NULL){ weight[q->vertice][p->arestas]=p->custo; p=p->prox_aresta; } } q=q->prox; } // termina criar matriz q=G->inicio; while(q!=NULL){ key[q->vertice]=9999; pai[q->vertice]=-1; enfila(&Q, q->vertice); q=q->prox; } key[r]=0; int u=buscaminimo(&Q, key); q=NULL; if(u!=-1){ q=buscavertice(G,u); } while(q!=NULL){ p=q->prox_aresta; while(p!=NULL){ if(pertence(&Q,p->arestas)==1 && weight[q->vertice][p->arestas]<key[p->arestas]){ pai[p->arestas]=q->vertice; key[p->arestas]=weight[q->vertice][p->arestas]; } p=p->prox_aresta; } u=buscaminimo(&Q, key); q=NULL; if(u!=-1){ q=buscavertice(G,u); } } }
void dijkstra(grafo *G, int s, int *distancia, int *pai){ no *q; aresta *p; grafo Q; define(&Q); int maior, r; maior=buscamaior(G); int weight[maior][maior]; //cria matriz de peso q=G->inicio; r=q->vertice; while(q!=NULL){ if(q->prox_aresta!=NULL){ p=q->prox_aresta; while(p!=NULL){ weight[q->vertice][p->arestas]=p->custo; p=p->prox_aresta; } } q=q->prox; } // termina criar matriz q=G->inicio; while(q!=NULL){ distancia[q->vertice]=9999; pai[q->vertice]=-1; enfila(&Q, q->vertice); q=q->prox; } distancia[s]=0; int u=buscaminimo(&Q, distancia); q=NULL; if(u!=-1){ q=buscavertice(G,u); } while(q!=NULL){ p=q->prox_aresta; while(p!=NULL){ if(distancia[p->arestas] > weight[q->vertice][p->arestas]+distancia[q->vertice]){ pai[p->arestas]=q->vertice; distancia[p->arestas]=weight[q->vertice][p->arestas]+distancia[q->vertice]; } p=p->prox_aresta; } u=buscaminimo(&Q, distancia); q=NULL; if(u!=-1){ q=buscavertice(G,u); } } }
/*Cria uma fila de tamanho n*/ void cria_fila(Fila* noCabeca, Fila* fimFila, int n) { int i = 1; inicializa_fila(noCabeca, fimFila); if(n == 0) { return; } while(i <= n) { enfila(noCabeca, fimFila, i); i++; } }