Ruta de viaje del coche ZZUSOFTOJ (problema de la ruta más corta)

1058: ruta de viaje del coche

Límite de tiempo: 1 segundo Límite de memoria: 128 MB
Envío: 15 Solución: 7
[ Enviar ] [ Estado ] [ Tablero de discusión ] [Protector: Importación externa]

Descripción del Título

Son las vacaciones de verano otra vez El coche que vive en la ciudad A quiere viajar a la ciudad B con amigos. Sabe que cada ciudad tiene cuatro aeropuertos, ubicados en los cuatro vértices de un rectángulo. Hay un ferrocarril de alta velocidad recto entre dos aeropuertos en la misma ciudad. El precio por unidad de kilometraje del ferrocarril de alta velocidad en la i-ésima ciudad Es Ti, hay rutas entre aeropuertos en dos ciudades diferentes y la unidad de kilometraje de todas las rutas es t. 
Entonces, ¿cómo debería Car organizar la ruta a la ciudad B para ahorrar la mayor cantidad de dinero posible? Descubrió que esta no es una pregunta simple, por lo que vino a preguntarle. 
Encuentre una ruta turística de la ciudad A a la B, los aeropuertos de salida y llegada en la ciudad se pueden elegir arbitrariamente, requiriendo el menor costo total. 

 

entrar

La primera línea tiene cuatro números enteros positivos s, t, A, B. 
S representa el número de ciudades, t representa el precio por unidad de kilometraje del avión y A y B son los números de serie de las ciudades A y B respectivamente, (1 <= A, B <= S). 
A continuación, hay S filas, y la fila I tiene 7 enteros positivos xi1, yi1, xi2, yi2, xi3, yi3, Ti, entre los cuales (xi1, yi1), (xi2, yi2), (xi3, yi3) Son las coordenadas de tres aeropuertos cualesquiera de la i-ésima ciudad, y Ti es el precio por unidad de kilometraje del ferrocarril de alta velocidad en la i-ésima ciudad. 

 

Salida

Imprima la respuesta, manteniendo un decimal.

 

Entrada de muestra

3 10 1 3 
1 1 1 3 3 1 30 
2 5 7 4 5 2 1 
8 6 8 8 11 6 3

 

Salida de muestra

47,5

 

rápido

Escala y convención de datos de salida 0 <S <= 100

 

análisis: 

El problema se resuelve en tres pasos:

① Encuentra el cuarto aeropuerto de la ciudad.

② Encuentre el costo de la ruta entre dos puntos cualesquiera.

③Encuentre el camino más corto en la imagen completa de los cuatro aeropuertos en el punto de partida.

Dado que los datos no son muy grandes, se eligió el algoritmo de Floyd.

 

Código:

#include<bits/stdc++.h>
using namespace std;

struct City
{
	double x[4];
	double y[4];
	double cost;
};

int main()
{
	City city[100];
	double t, fare[410][410], ans = 1e9, dp[4][400];
	int  a, b, s, k, l;


	cin >> s >> t >> a >> b;//input
	for (int i = 0; i < s; i++)
	{
		for (int j = 0; j < 3; j++)
		{
			cin >> city[i].x[j] >> city[i].y[j];
		}
		cin >> city[i].cost;
	}

	for (int i = 0; i < s; i++)//求第四个点的坐标
	{
		for (int j = 0; j <= 2; j++)
		{
			if (((city[i].x[(j + 2) % 3] - city[i].x[j])*(city[i].x[(j + 1) % 3] - city[i].x[j])) == ((city[i].y[(j + 1) % 3] - city[i].y[j])*(city[i].y[j] - city[i].y[(j + 2) % 3])))
			{
				city[i].x[3] = city[i].x[(j + 1) % 3] + city[i].x[(j + 2) % 3] - city[i].x[j];
				city[i].y[3] = city[i].y[(j + 1) % 3] + city[i].y[(j + 2) % 3] - city[i].y[j];
			}
		}
	}

	for (int i = 0; i < s * 4; i++)// 求任意两点间的费用
	{
		for (int j = i; j < s * 4; j++)
		{
			fare[i][j] = sqrt((city[i / 4].x[i % 4] - city[j / 4].x[j % 4])*(city[i / 4].x[i % 4] - city[j / 4].x[j % 4]) + (city[i / 4].y[i % 4] - city[j / 4].y[j % 4])*(city[i / 4].y[i % 4] - city[j / 4].y[j % 4]));
			if (i / 4 == j / 4)
			{
				fare[i][j] *= city[i / 4].cost;
			}
			else
			{
				fare[i][j] *= t;
			}
			fare[j][i] = fare[i][j];
		}
	}

	//init
	for (int i = 0; i<4; i++){
		for (int j = 0; j<400; j++){
			dp[i][j] = 1e9;
		}
		dp[i][a * 4 - 4 + i] = 0;
	}

	for (int i = 0; i<4; i++)//4次Floyd
	{
		for (int cnt = 0; cnt<s; cnt++)
		{
			double(*old_dp)[400] = dp;
			for (int j = 0; j<s * 4; j++)
			{
				for (int k = 0; k<s * 4; k++)
				{
					dp[i][j] = min(old_dp[i][j], old_dp[i][k] + fare[j][k]);
				}
			}
		}
	}

	for (int i = 0; i < 4; i++)
	{
		for (int j = 0; j < 4; j++)
		{
			ans = min(ans, dp[i][b * 4 - 4 + j]);
		}
	}
	printf("%.1lf", ans);
	return 0;
}

 

Supongo que te gusta

Origin blog.csdn.net/qq_43700916/article/details/88830989
Recomendado
Clasificación