Red de conocimiento informático - Aprendizaje de código fuente - Algoritmo de Dijkstra para el camino más corto

Algoritmo de Dijkstra para el camino más corto

El algoritmo de Dijkstra (Dijkstra) es un algoritmo típico de enrutamiento de ruta más corta, que se utiliza para calcular la ruta más corta desde un nodo a todos los demás nodos. La característica principal es que se expande capa por capa desde el punto inicial hasta llegar al punto final. El algoritmo de Dijkstra puede obtener la solución óptima del camino más corto, pero debido a que atraviesa muchos nodos para el cálculo, es ineficiente. Se puede utilizar la optimización del montón.

El algoritmo de Dijkstra es un algoritmo de ruta más corta muy representativo y se presenta en detalle como contenido básico en muchos cursos profesionales, como estructura de datos, teoría de grafos, investigación de operaciones, etc.

La expresión general de Dijkstra generalmente se expresa de dos maneras, una usando etiquetas permanentes y temporales, y la otra usando la tabla OPEN, CLOSE para usar el algoritmo A* y el algoritmo D*. A continuación, las expresiones son consistentes y aquí se utilizan las tablas OPEN y CLOSE.

Adopta la estrategia del algoritmo codicioso

El proceso aproximado:

Crea dos tablas, ABRIR y CERRAR.

La tabla ABIERTA guarda todos los nodos que se han generado pero no examinados, y la tabla CERRADA registra los nodos que se han visitado.

1. Visite el punto de la red de carreteras más cercano al punto de inicio y que no haya sido revisado, y coloque este punto en el grupo ABIERTO para esperar la inspección.

2. Encuentre el punto más cercano al punto inicial de la tabla OPEN, busque todos los nodos secundarios de este punto y coloque este punto en la tabla CLOSE.

3. Recorra y examine los nodos secundarios de este punto. Encuentre el valor de distancia de estos nodos secundarios desde el punto inicial y coloque los nodos secundarios en la tabla ABIERTA.

4. Repita los pasos 2 y 3 hasta que la tabla OPEN esté vacía o se encuentre el punto objetivo.

#include#includeusing?namespace?std;void?dijkstra(const?int?&beg,//Punto de partida?const?vector?>?&adjmap,//Matriz de adyacencia, por pasar la referencia evita copiar?vector?&dist,//¿La longitud de ruta más corta desde el punto inicial hasta cada punto?vector?&path)//El punto anterior en la ruta que llega a este punto//Los bordes negativos son se considera desconectado/ /Beneficios: ¡Esta función no utiliza ninguna variable global y se puede copiar directamente! {const?int?&NODE=adjmap.size();//Utilice el tamaño de la matriz de adyacencia para transferir el número de vértices y reducir la transferencia de parámetros dist.assign(NODE,-1);//Inicializar la distancia a un desconocido path.assign(NODE, -1);//La ruta de inicialización es desconocida vector?flag(NODE,0);//Marca la matriz para determinar si se ha procesado dist[beg]=0;// La longitud del camino desde el punto de partida hasta sí mismo es 0 while(1) {int?v=-1;//Inicializado en desconocido for(int?i=0;?i!=NODE;?++i)if( !flag[i]&&dist[i]>=0)//Buscar No ha sido procesado y if(v<0||dist[i]=0)//Hay una ruta Unicom y if( dist[i]<0||dist[v]+adjmap[v][i]>n_num>>e_num>>beg;vector?>?adjmap (n_num,vector(n_num,-1));//Matriz de adyacencia de inicialización predeterminada para(int?i=0,p ,q;?i!=e_num;?++i){cout<>p>> q;cin>>adjmap[p][q];}vector?dist,path;//Se utiliza para recibir la longitud de la ruta más corta y cada punto de la ruta dijkstra(beg,adjmap,dist,path);for(int? i=0;?i!=n_num;?+ +i){La distancia más corta desde cout<= 0;?w=ruta[w])cout<