Red de conocimiento informático - Aprendizaje de código fuente - Tarea de diseño del curso de estructura de datos: Encontrar el problema del camino más corto entre dos puntos cualesquiera, escribir un programa completo... Ayuda urgente... No lo aprendí bien el semestre pasado... Puntos extra por resolverlo

Tarea de diseño del curso de estructura de datos: Encontrar el problema del camino más corto entre dos puntos cualesquiera, escribir un programa completo... Ayuda urgente... No lo aprendí bien el semestre pasado... Puntos extra por resolverlo

Uno:

#include "stdafx.h"

#include lt;limitsgt;

#include lt;iostreamgt; /p>

#include lt; fstreamgt;

usando el espacio de nombres

const int MAXINT = numeric_limitslt; >plantilla lt; clase Typegt;

void Dijkstra(int n, int v, Tipo dist[], int prev[], Tipo** c)

{

bool *s = new bool[n 1];

int i, j

for(i = 1; i lt; =n; i)

{

dist[i] = c[v][i]

if(c[v][i]!=MAXINT)

anterior[i] = v;

más anterior[i] =0;

s[i] = falso

}

s[v] = verdadero;

dist[v] = 0;

anterior[v] = 0

for(i = 1; ; ilt; n; i)

{

int u = v;

int temp =

para( j = 1; jlt;=n; j)

if(!s[j]amp;amp;dist[j]lt;temp)

{

u = j;

temp = dist[j];

}

s[u] = verdadero

para(j =1; jlt; =n; j )

{

if((!s[j])amp;c[u][j]lt;MAXINT)

{

if((dist[u] c[u][j])lt; dist[j])

{

dist[j] = dist[u]

c[u][j];

anterior[j] = u

}

}

}

}

eliminar [] s;

}

void djpath(int m, int v, int prev[])

{

int i = m, j =1

mientras(i!=0)

{

si ( j == 1)

{

coutlt;lt;

j = 0; p> else

coutlt;lt; "-" lt;lt;

i = prev[i]; p> coutlt;lt;endl;

}

int _tmain(int argc, _TCHAR* argv[])

{

coutlt;lt;"Entero máximo:"lt;lt;MAXINTlt;lt;endl;

int prev[6], dist[6]; ;

int** myc;

ARCHIVO *fp

fp=fopen("data.txt", "r");

fscanf(fp, "d", amp; n);

myc = new int* [n 1]; ; i )

myc[i] = nuevo int[n 1];

for(i=1; ilt;=n; i )

for (j =1; jlt; =n; j)

{

fscanf(fp, "d", amp; myc[i][j]);

if (myc[i][j]==-1)

myc[i][j] = MAXINT

}

Dijkstra; (5, 1, dist, anterior, myc);

for(i = 1; ilt; =5; i )

lt; ;endl;

para(i=2; ilt;=5; i)

p>

djpath(i, 1, anterior);

for(i = 0; ilt; = 5; i)

eliminar[] myc[i]; /p>

eliminar [] myc;

devolver 0;

}

Los datos de entrada están en formato de archivo de texto. de datos.txt:

5

0 10 -1 30 100

10 0 50 -1 -1

-1 50 0 20 10

30 -1 20 0 60

100 -1 10 60 0

Este artículo proviene del blog de CSDN. Indique la fuente al reimprimir. : /mikewolf2009/archive/2009/09 /12/4545537.aspx

Dos:

#includelt;iostreamgt;

usando el espacio de nombres std;

void main()

{

int infinito=100, j, i, n, k, t, **w, *s, *p, *d ;

coutlt ;lt; "ingrese el valor de n:"

cingt;gt;n

coutlt;lt;endl;

d=nuevo int[n];

s=nuevo int[n];

p=nuevo int[n]; =nuevo int*[n];

for(i=0;ilt;n;i) {w[i]=nuevo int[n];}

for(i =0;ilt;n;i)

for(j=0;jlt;n;j)

cingt;gt;w[i][j];

for(s[0 ]=1, i=1; ilt; n; i )

{

s[i]=0; w[0][i];

if(d[i]lt; infinito) p[i]=0

else p[i]=-1; p>

}

for(i=1;ilt;n;i)

{

t=infinity;k=1

for(j= 1;jlt;n;j )

if((!s[j])amp;amp;(d[j]lt;t)) {t= d[j];k=j } // Seleccionar un punto azul k con la distancia más corta en el conjunto de puntos azules para expandir el conjunto de puntos rojos es la clave del algoritmo de Dijkstra

s[k]= 1; // el punto k une el S

for (j=1;jlt;n;j) //Después de expandir k al punto rojo, la distancia estimada del conjunto de puntos azules restante se puede reducir debido a la adición del nuevo punto rojo k, y en este momento se debe realizar el ajuste correspondiente La distancia estimada del punto azul. Para cualquier punto azul j, si D[j] se vuelve más pequeño después de que k cambia de azul a rojo, debe ser porque hay un camino más corto de s a j e incluye el nuevo punto rojo k: P=s,.. ,k,jgt;. Y el nuevo camino P con D[j] reducido solo puede estar compuesto por el camino lt;..., kgt;

Por lo tanto, cuando length(P)=D[k] wlt;k,jgt; es menor que D[j], la longitud de P debe usarse para modificar el valor de D[j].

if((!s[j])amp;amp;(d[j]gt;d[k] w[k][j]))

{d[ j]=d[k] w[k][j];p[j]=k;}

}

coutlt;lt;"Desde el punto fuente a otros vértices La distancia más corta es la siguiente: ";

for(i=1;ilt;n;i) coutlt;lt;d[i]lt;lt;";

}

Los dos códigos anteriores son totalmente utilizables. Utilice el que desee. Aún puedes analizar el código cuidadosamente tú mismo.