Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Vigaku

Oque isso esta querendo dizer?

Recommended Posts

Implementação básica do algoritmo de Djikstra.

 

void DIGRAPHsptD1(Digraph G, Vertex s, Vertex parnt[], double cst[]){

Vertex w, w0, fr[maxV];

for (w = 0; w < G->V; w++) {

parnt[w] = -1;

cst[w] = maxCST;

}

fr = s;

cst = 0.0;

while (1) {

double mincst = maxCST;

for (w = 0; w < G->V; w++) {

if (parnt[w] == -1 && mincst > cst[w])

mincst = cst[w0=w];

if (mincst == maxCST) break;

parnt[w0] = fr[w0];

for (w = 0; w < G->V; w++)

if (cst[w] > cst[w0] + G->adj[w0][w]) {

cst[w] = cst[w0] + G->adj[w0][w];

fr[w] = w0;

}

}

}

 

Galera, to precisando urgente de uma ajuda, keria saber oa esta havendo nesse código, é um lance de nós com ponteiro. Por favor algume me da um help, é urgente :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

O problema desse código é que falta coisa:

 

- Fechar as chaves do primeiro for.

- w0 é inicializado com o quê?

 

Tudo começa com maxCST e -1 em cst, sendo mincst = maxCST, então o primeiro if do 1º não é executado nunca e o resto das operações com array tem índice indefinido.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Sim o codigo esta imcompleto mesmo..... é apenas um trexo, mas tenho q saber sobre este trexo.

E de errado ele não tem nada, foi o Prof. q passou ele. N fui na aula desse dia, me ferrei :(

Compartilhar este post


Link para o post
Compartilhar em outros sites

Certeza que não tem nada de errado?

 

void DIGRAPHsptD1(Digraph G, Vertex s, Vertex parnt[], double cst[]){
  Vertex w, w0, fr[maxV];
  for (w = 0; w < G->V; w++) {
	parnt[w] = -1;
	cst[w] = maxCST;
  } // FIM DO FOR DE INICIALIZAÇÃO

  fr[s] = s;
  cst[s] = 0.0;

  while (1) {
	double mincst = maxCST;
	for (w = 0; w < G->V; w++) {
		  if (parnt[w] == -1 && mincst > cst[w])
				  mincst = cst[w0=w];
		  if (mincst == maxCST)
				   break;
		  parnt[w0] = fr[w0];
		  for (w = 0; w < G->V; w++)
				 if (cst[w] > cst[w0] + G->adj[w0][w]) {
							 cst[w] = cst[w0] + G->adj[w0][w];
							 fr[w] = w0;
				 } // FIM DO IF DA RELAXACAO
	} // FIM DO FOR OU DO WHILE??
} // FIM DO WHILE OU DA FUNCAO??

 

Se você tem 4 vértices no grafo:

parnt: -1 -1 -1 -1

cst: * * * *

fr: ? ? ? ?

 

 

S = 2

parnt: -1 -1 -1 -1

cst: * * 0.0 *

fr : ? ? 2 ?

 

-> while(1)

-> double mincst = *

-> w = 0

-> if (parnt[0] == -1 && mincst > cst[0]): FALSO

-> if (mincst == maxCST) : VERDADEIRO. Sai do loop for e vai para o while(1)

 

Ou então se a chave vier logo após o break:

 

-> while(1)

-> mincst = *

-> w = 0

-> if (parnt[0] == -1 && mincst > cst[0]): FALSO

-> if (mincst == maxCST) : VERDADEIRO. Sai do loop for e segue.

-> parnt[w0] = fr[w0] : w0 não foi definido. Coisas erradas acontecem aqui.

 

Pelo jeito da coisa isso deve ser C ou C++ sem classes.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.