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 ; p>
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.