Programación de rutas
El problema final es encontrar el camino más corto (los puntos de ciudad pasados en este momento corresponden a la longitud del camino).
Simplemente ingresa la ruta al final.
No puedo darte una implementación específica por el momento. Si es necesario, lo escribiré cuando tenga tiempo.
Ahora sólo te daré una referencia para encontrar el camino más corto.
Puedes entrar a mi blog para echarle un vistazo. ¿Existe alguna implementación específica (www.ourys.com/sword)?
El proceso es el siguiente:
/* * * *Implementación de la pila
#Contiene? & ltstdio.h & gt
¿#Contiene? & ltstdlib.h & gt
#¿Definición? ¿STACK_INIT_SIZE? 100
#Definición? ¿INCREMENTO DE APILACIÓN? 10
typedef? int? estado;
typedef? int? QElemType
typedef? estructura? Pila SQL {
QElemType? *Base;
QElemType? * arriba
int? tamaño de pila
} SqStack
¿No es válido? InitStack(SqStack?*S)
{
(*S). ¿base? =?(QElemType?*)malloc(STACK_INIT_SIZE?*?sizeof(QElemType));
if (!(*S).base)? Salir(0);
(*S). ¿arriba? =?(*S). Base;
(*S). ¿Tamaño de pila? =?Tamaño de inicialización de la pila;
}
¿No es válido? DestroyStack(SqStack?*S)
{
Gratis((*S). Base);
}
¿Destruir? ClearStack(SqStack?*S)
{
(*S). ¿arriba? =?(*S). Base;
}
¿Estado? StackEmpty(SqStack?*S)
{
if((*S).top?==?(*S).base)? ¿devolver? 1;
¿Y si? ¿devolver? 0;
}
¿Estado? StackLength(SqStack?*S)
{
¿Regresión? ((*S).top?-?(*S).base);
}
QElemType? GetTop(SqStack?*S, QElemType?e)
{
if((*S).top?!=?(*S).base)
{
e? =?*((*S).top?-?1);
¿Regresión? e;
}
¿Y si? printf(" ERROR ");
}
¿No es válido? push(SqStack?*S, QElemType?e)
{
if((*S).top?-?(*S).base?>=?(* S ). Tamaño de la pila)
{
(*S). ¿base? =?(QElemType?*)realloc((*S).Base, ((*S).¿Tamaño de pila?+?STACKINCREMENT?*?sizeof(QElemType));
If (!(* S). Salir(0);
(*S). ¿arriba? =?(*S). ¿base? +?(*S). tamaño de pila
(*S).
¿Tamaño de pila? +=?Incremento de pila;
}
*(*S). arriba++? =?e;
}
QElemType? Pop(SqStack?*S)
{
if((*S).top?==?(*S).base)? printf(" ERROR ");
Otro
{
QElemType? ¿mi? =?*?- (*S). Arriba;
¿Volver? e;
}
}
//¿Fin? Montón
typedef? estructura? Gráfico
{
int? vexnum
int? arcnum
QElemType? * vex
int? * * AdjMatrix
}Imagen;
¿No es válida? CreateUDN(Graph?*G)
{
Printf("Ingrese el número de vértices y aristas del gráfico:\ n ");
scanf( "% d%d ", & amp((*G). wicknum); ((*G). arcnum));
QElemType? v1, v2;
int? I, j, m, n;
(*G). ¿vejar? =?(QElemType?*)malloc((*G).Wexnum?*?sizeof(QElemType));
(*G). AdjMatrix? =?(int?**)malloc((*G).wicksnum?*?sizeof(int?*));
For (i?=?0;i?< ? (*G) . vexnumi++)
(*G). ¿AdjMatrix[i]? =?(int?*)malloc((*G).wicksnum?*?sizeof(int));
For (i?=?0;i?<?(* G). vexnumi++)
Para (j?=?0;j?<?(*G).vexnumj++)
(*G). ¿AdjMatrix[i][j]? =?10000;? //Usa números grandes para simular el infinito
Printf("Ingrese el significado de cada vértice (por ejemplo, el primer vértice es 1, el segundo vértice es 2):\ n ");
For (i?=?0;i?<?(*G).vexnumi++)
scanf("%d ", & amp((*G).vex[I]);
Printf("Ingrese dos puntos conectados a cada borde del gráfico no dirigido: \ n "
For (i?=?0;i?<?( *G). arcnumi++)
{
scanf("%d%d ", & ampv1.v2);
For (j?=?0 ;j? j ;
Si (v2?==?(*G).vex[j])?n?=?j;
}
(* G ). AdjMatrix[m][n]? =?(*G)? =?1;
}
¿Ruta más corta_DIJ (gráfico? *gph, QElemType? data1, QElemType? data2)
{
int?, min
SqStack?
pila de inicio(& s); p>
int? =?(int?*)malloc( (*gph).
¿Wicksham? *?sizeof(int));
int? *registro de ruta? =?(int?*)malloc((*gph).wicksnum?*?sizeof(int));
¿Booleano? *¿Visitado? =?(bool?*)malloc((*gph).wicksnum?*?sizeof(bool));
For (i?=?0;i?<?(* gph). vexnumi++) ? ¿Me visitó? =?false;
Para (I?=?0;I?<?(*gph).vexnumi++)
{
if(data1 ?= =?(*gph).vex[i])? v? =?i;
if(data2?==?(*gph).vex[i])? ¿tú? =?i;
}
para (i?=?0;i?<?(*gph).vexnumi++)
{
spath[i]? =?(*gph). Matriz[v][I];
registro de ruta[i]? =?五;
}
¿Chapoteo, chapoteo? =?0;¿Has visitado? =?Verdadero;registro de ruta[v]? =?-1;
Para (yo?=?1;yo?<?(*gph).vexnumi++)
{
Min? =?10000;
For (j?=?0;j?<?(*gph).vexnumj++)
{
Si (!tiene acceso [j])
{
if(spath[j]?<?min)? {minutos? =?spath[j];k? =?j;}
}
}
¿Visitaste [k]? =?True;
Para (j?=?0;j?& lt?(*gph).vexnumj++)
Si (! visitó [j]?& amp& amp ? (*gph)? 10000?& amp? >
{
spath[j]? =?spath[k]+(*gph matriz[k][j]; p>
pathrecord[j]? =?k;
}
}
Gratis (visitado);
Push (&s,u);
p>Para (v?=?registro de ruta[u]; v?!=?-1;v?=?registro de ruta
Empuje ( & amps, v);
Y(! StackEmpty(&s))
{
¿Yo? =?pop(&s);
printf(" %d? ", (*gph).vex[I]);
}
printf("\n"); p>
Destruir pila(& amps);
Libre (spath);
Libre (registro de ruta);
}
¿No es válido? p>
{
¿Gráfico? g;
create udn(&g);
Printf("Ingrese inicio y fin puntos:\n ");
QElemType? datos1, datos2
scanf("%d%d ", & amp datos1.
datos 2);
Printf("A través de los siguientes puntos: \ n ");
ruta más corta de DIJ (& ampg, datos1, datos 2); > }
La simulación se ejecuta de la siguiente manera:
Ingrese el número de vértices y aristas 4, 6.
Ingrese datos de vértice: (por ejemplo, 1 significa Shenyang, 2 significa Dalian, puede especificarlo usted mismo) 1, 2, 3, 4.
Introduce dos puntos a cada lado: (1, 2), (1, 4), (1, 3), (2, 3), (2, 4), (3, 4).
Introduzca punto de inicio y punto final: 1? 3
¿Puedes obtener el vértice mínimo que deseas pasar (incluidos el punto inicial y el punto final)?
Esto está disponible en VC6.0. Si tu compilador no funciona, dímelo.