Red de conocimiento informático - Programación de la red - Programación de rutas

Programación de rutas

Este es un problema del camino más corto. Tratas cada ruta como si tuviera un peso de 1.

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);

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];

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");

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.