Planificación turística (25 puntos) (Dijkstra)

Con un mapa de ruta de viaje sin conductor, sabrá la longitud de la carretera entre ciudades y los peajes que se cobrarán por la carretera. Ahora es necesario redactar un programa para ayudar a los turistas que vienen a consultar a encontrar el camino más corto entre el punto de partida y el destino. Si hay varias rutas que son las más cortas, se debe generar la ruta más barata.
Formato de entrada:
Descripción de entrada: La primera línea de los datos de entrada da 4 enteros positivos N, M, S, D, donde N (2≤N≤500) es el número de ciudades. Por cierto, suponga que el número de ciudad es 0 ~ (N-1); M es el número de autopistas; S es el número de ciudad del lugar de salida; D es el número de ciudad del destino. En las siguientes líneas M, cada línea proporciona información sobre una carretera, que son: ciudad 1, ciudad 2, longitud de la carretera y monto del peaje, separados por espacios, y los números son todos enteros y no exceden de 500. La entrada garantiza la existencia de la solución.

Formato de
salida : muestra la longitud de la ruta y la carga total en una línea, separados por espacios entre los números y sin espacios adicionales al final de la salida.

Muestra de entrada:

4 5 0 3
0 1 1 20
1 3 2 30
0 3 4 10
0 2 2 20
2 3 1 20

Salida de muestra:

3 40

Ideas de preguntas:
1. Resolví el problema refiriéndome a la explicación del algoritmo de Dijkstra en el libro de "Notas de algoritmo" del libro de Hu Fan. Los últimos tres puntos de prueba en el pta siempre estaban equivocados, y luego descubrí que estaba construcción en el proceso de construcción del mapa Es un gráfico dirigido, porque debe ser un proceso bidireccional.
2. Esta pregunta es el algoritmo de Dijkstra con pesos laterales, que es una aplicación flexible basada en el algoritmo de Dijkstra.
3. Con respecto al algoritmo de Dijkstra, mi comprensión personal es atravesar n vértices, encontrar el vértice con el peso más pequeño cada vez y luego usar ese vértice como intermediario para encontrar el siguiente borde más corto y usar la matriz d para registrarlo.

#include<iostream>
#include<algorithm>
using namespace std;
const int MAXN = 1005;
const int INF = 0x3f3f3f;
int n, m, s, ter, Graph[MAXN][MAXN];	
int d[MAXN];		//当前顶点到起点的最短路径长度
int c[MAXN];		//当前顶点到起点的花费
int cost[MAXN][MAXN];	//两个顶点间的花费
bool Visited[MAXN];	//访问标志数组
void Dijkstra(int s);
int main()
{
    
    
	fill(Graph[0], Graph[0] + MAXN * MAXN, INF);
	fill(cost[0], cost[0] + MAXN * MAXN, INF);		//初始化
	int u, v, w, x;
	cin >> n >> m >> s >> ter;
	while (m--)							//建图
	{
    
    
		cin >> u >> v >> w >> x;
		Graph[u][v] = Graph[v][u] = w;		//记住这道题问的是无向图,建立的时候是双向的
		cost[u][v] = cost[v][u] = x;
	}

	Dijkstra(s);			
		
	cout << d[ter] << " " << c[ter];	//输出terminal顶点到起点的最短路径长度和最少花费

	return 0;
}
void Dijkstra(int s)
{
    
    
	fill(d, d + MAXN, INF);
	fill(c, c + MAXN, INF);
	d[s] = 0;					
	c[s] = 0;				//以上四条语句均为初始化
	for (int i = 0; i < n; i++)		//循环n次
	{
    
    
		int u = -1, MIN = INF;
		for (int j = 0; j < n; j++)		//查找权值最小的边
			if (!Visited[j] && d[j] < MIN)	//寻找未被访问顶点中最小d[]
			{
    
    
				u = j;
				MIN = d[j];
			}
		if (u == -1) return;		//如果找不到小于INF,说明剩下的点不连通
		Visited[u] = true;			//标记
		for (int v = 0; v < n; v++)		//以找到的u作为连接下一个顶点v的中介点
			if (!Visited[v] && Graph[u][v] != INF)
			{
    
    
				if (d[u] + Graph[u][v] < d[v])	//下一条权值小的边
				{
    
    
					d[v] = d[u] + Graph[u][v];	//更新权值
					c[v] = c[u] + cost[u][v];	//更新费用
				}
				else if (d[u] + Graph[u][v] == d[v] && c[u] + cost[u][v] < c[v])//路径相同,但费用变小则需要更新
					c[v] = c[u] + cost[u][v];
				}
	}
}

Supongo que te gusta

Origin blog.csdn.net/xdg15294969271/article/details/114293182
Recomendado
Clasificación