No rastreará el código fuente
Código fuente:
/*
La pequeña L vive en muchas ciudades. ...
Autor: q839219286
Idea de algoritmo: el mapa de la ciudad utiliza la búsqueda DFS y la condición de finalización de la búsqueda es: ¿llegar al punto final o? ¿Configuración Vmax-Vmin>dV
? DV=Vmax-Vmin, ¿cuál es el método para encontrar DV? El historial recursivo de Vmax y Vmin
La estructura del gráfico utiliza el método de lista de adyacencia y la estructura de almacenamiento utiliza una matriz.
*/
//Versión en lenguaje C
# incluir ltstdio.h gt
# incluir ltstdlib.h gt
#¿Contiene? lt restricción. gt
//Función de definición de macro
#Definición? MÁXIMO(a,b)? (a)>(b)? (a): (b)
#¿Definición? MÍN(a,b)? (1)lt(b)? (a): (b)
//Estructura de nodo gráfico (método de lista de adyacencia)
struct? ¿Nodo V? {
estructura? ¿borde? *Siguiente;
¿Ciel? Visitado; // Si ha sido visitado en esta ruta, = 1 Sí = 0 No.
};
//La estructura de borde del gráfico (método de lista de adyacencia)
struct? ¿borde? {
int? Cinco; //Velocidad de la carretera
estructura? ¿Nodo V? * adjVex//El nodo de la ciudad al que conduce la carretera.
estructura? ¿borde? *Siguiente;
};
#¿Definición? max_Vex? 500
#¿Definición? max_Edge? 5000
//Hasta 500 ciudades (no use el subíndice 0)
struct? ¿Nodo V? Vex【max_Vex? ?1];
estructura? ¿borde? Borde[max_Edge? *?2]; //Un borde tiene dos nodos para registrar.
int? vex_Núm? Número de aristas;
estructura? ¿Nodo V? *comenzar,? *Fin; //Punto inicial y final
int? minDIF//La diferencia mínima entre Vmax-Min en la ruta hacia el destino que se ha encontrado.
¿Anulado? addEdge(int? Ui, ? int? VI, ? int? wi); //Agregar? ¿Ui? ¿A dónde ir? El camino de Wei
¿Evitado? construir gráfico();
¿No es válido? DFS(struct?VNode?*vex?int?Vmax?int?vmin);
int? principal()? {
int? q;scanf("d", ampq); //Un número entero q que indica cuántos conjuntos de datos de prueba hay.
int? Fuera [5], yo; //2≤Q≤5
¿Para qué? (I = 0;?i ltq?;?i)? {
construir gráfico(); // Ya contiene scanf.
DFS(start,-1,?INT_MAX-1);
¿Fuera de [I]? =?minDIF
}
//Emitir el resultado final
¿Para qué? (I?=?0;?I ltq;?i)? {
printf("d\n ",out[i]?);
}
//getchar();? getchar(); //¿Prevenir flashback
¿Regresión? 0;
}
¿No válido? ¿DFS(estructura? VNode? *vex, int? ¿Vmax internacional? ¿Vmin)? {
¿Y si? (Vmax?-?Vmin? gt=?minDIF) regresa; //Una vez que se excede el límite, no tiene sentido continuar atravesando.
¿Y si? (¿enfadado?==?fin)? {//Llegó al final
Mindiv? =?Vmáx? -?Vmin//¿Estás de acuerdo? ¿Vmáx? -?Vmín? ¿Es? Mindiff
} ¿Algo más? {//Continuar atravesando
vex->; ¿Has visitado? =?1; //Evitar el bucle infinito DFS
struct? ¿borde? *Siguiente;
¿Para qué? (¿Siguiente?=?vex->Siguiente;
¿Siguiente?!=?NULL?Siguiente?=?Siguiente-gt;Siguiente)? {
if(0==? next-gt; adj vex- gt; visitado) //El siguiente nodo no se encuentra entre los nodos pasados.
DFS(siguiente->adjVex?MAX(siguiente->v,?Vmax),?MIN(siguiente->v,?vmin));
}
vex->;¿Has visitado? =?0;//Regreso al pasado
}
}
//¿Agregar? ¿Ui? ¿A dónde ir? El camino de Wei
¿Evitado? addEdge(int? Ui, ? int? VI, ? int? Wi)? {
Borde[número de borde]. adjVex? =? molesto? ? Seis;
Borde [número de borde]. v? =?wi;
Borde [número de borde]. ¿Próximo? =?vex[Ui]. Next; //Método de inserción del encabezado de la lista vinculada
vex[Ui]. ¿Próximo? =?borde? Número de aristas;
edge _ num;
}
¿No es válido? construirGraph()? {
int? ¿Número de carretera? I,? ID de inicio,? endID
estructura? ¿Nodo V? * p _ V;
scanf("d? d ", ampvex_Num? amproad _ Num);
//Inicializa el nodo. Recorra en orden inverso, tenga en cuenta que vex [0] no se cuenta. De hecho, se puede eliminar con memset(). Escribí la versión del código nativo.
¿Para qué? (p_V?=?vex? ?vex _ Num?p_V? gt?vex?p_V -)? {
p _ V- gt;¿Siguiente? =?NULL
p _ V- gt;¿Visitado? =?0;
}
//Atención? Carretera_Núm carretera? ¿Qué pasa? 2*edge_Num? ¿Borde de la tabla adyacente
número_borde? =?0;
¿Para qué? (;? Núm_carretera? gt? 0;? Núm_carretera -)? {//carretera_núm carreteras? Lea los datos de la fila road_Num.
int? Ui,? seis,? wi; //3 enteros Ui, Vi, Wi,? (I = 1,...,m), los dos números de ciudad de la vía y la velocidad de conducción de la vía.
scanf("d?d?d", ampUi,? amp6,? ampwi);
//Tenga en cuenta que se deben agregar ambas direcciones.
addEdge(Ui, VI, ?wi);
addEdge(Vi, Ui, ?wi); /Asignación de datos restantes
scanf("d?d", ampstartID,? ampendID);
¿Iniciar? =? molesto? ?startID
¿Fin? =? molesto? ?endID
Mindiff? =?INT_MAX
}