Seguinte: Códigos-fonte: Solução por heurística
Acima: Códigos-fonte: Solução por força
Anterior: fbruta.h
001 #include "fbruta.h"
002 #include <stdio.h>
003 #include <string.h>
004 #include <limits.h>
005 #include <stdlib.h>
006
007
008 void fbrutaRecursa(TPcvData *PcvData)
009 {
010
011 int u = PcvData->anCaminho[PcvData->nVisitados - 1];
012 int v;
013
014
015 for (v = 0; v < PcvData->nNumVertices; v++) {
016
017 if (PcvData->acCorVert[v] != COR_BRANCO) continue;
018
019
020 PcvData->acCorVert[v] = COR_CINZA;
021
022 PcvData->anCaminho[PcvData->nVisitados] = v;
023
024 PcvData->nDistTotal += PcvData->anDist[u][v];
025
026
027
028 if (PcvData->nVisitados == PcvData->nNumVertices - 1) {
029
030 int nDistTotal = PcvData->nDistTotal +
031 PcvData->anDist[v][PcvData->anCaminho[0]];
032
033
034
035 if (PcvData->nMinDistTotal > nDistTotal) {
036
037 PcvData->nMinDistTotal = nDistTotal;
038
039 memcpy(&PcvData->anMinCaminho, &PcvData->anCaminho,
040 PcvData->nNumVertices * sizeof(int));
041 }
042
043
044
045 } else {
046
047 PcvData->nVisitados++;
048
049 fbrutaRecursa(PcvData);
050
051 PcvData->nVisitados--;
052 }
053
054
055 PcvData->nDistTotal -= PcvData->anDist[u][v];
056
057 PcvData->acCorVert[v] = COR_BRANCO;
058 }
059 }
060
061
062
063
064 void procCaminhoFBruta(TPcvData *PcvData)
065 {
066
067 memset(&PcvData->acCorVert, COR_BRANCO, PcvData->nNumVertices *
068 sizeof(char));
069
070
071 PcvData->nMinDistTotal = INT_MAX;
072
073
074
075 PcvData->acCorVert[0] = COR_CINZA;
076
077 PcvData->anCaminho[0] = 0;
078
079 PcvData->nVisitados = 1;
080
081
082 PcvData->nDistTotal = 0;
083
084
085 fbrutaRecursa(PcvData);
086 }
Seguinte: Códigos-fonte: Solução por heurística
Acima: Códigos-fonte: Solução por força
Anterior: fbruta.h
VilarNt
2003-06-20