El algoritmo C Dijkstra utilizó la estación de servicio 1072 varias veces (30 puntos)

Gasolinera 1072 (30 puntos)

Se debe construir una estación de servicio en una ubicación tal que la distancia mínima entre la estación y cualquiera de las viviendas residenciales esté lo más lejos posible. Sin embargo, debe garantizar que todas las casas estén en su rango de servicio.

Ahora, dado el mapa de la ciudad y varias ubicaciones candidatas para la estación de servicio, se supone que debes dar la mejor recomendación. Si hay más de una solución, envíe la que tenga la menor distancia promedio a todas las casas. Si dicha solución aún no es única, envíe la que tenga el número de índice más pequeño.

Especificación de entrada:
cada archivo de entrada contiene un caso de prueba. Para cada caso, la primera línea contiene 4 enteros positivos: N (≤10
3
), el número total de casas; M (≤10), el número total de ubicaciones candidatas para las estaciones de servicio; K (≤10
4
), el número de caminos que conectan las casas y las estaciones de servicio; y D
S
, el rango de servicio máximo de la estación de servicio. Por lo tanto, se supone que todas las casas están numeradas del 1 al N, y todas las ubicaciones candidatas están numeradas del G1 al GM.

Luego siguen las líneas K, cada una describe una carretera en el formato

P1 P2 Dist

donde P1 y P2 son los dos extremos de una carretera, que pueden ser números de casa o estaciones de servicio, y Dist es la longitud entera de la carretera.

Especificación de salida:
para cada caso de prueba, imprima en la primera línea el número de índice de la mejor ubicación. En la línea siguiente, imprima las distancias mínima y media entre la solución y todas las casas. Los números en una línea deben estar separados por un espacio y tener una precisión de hasta 1 decimal. Si la solución no existe, simplemente envíe Sin solución.

Entrada de muestra 1:

4 3 11 5
1 2 2
1 4 2
1 G1 4
1 G2 3
2 3 2
2 G2 1
3 4 2
3 G3 2
4 G1 3
G2 G1 1
G3 G2 2

Salida de muestra 1:

G1
2.0 3.3

Entrada de muestra 2:

2 1 2 10
1 G1 9
2 G1 20

Salida de muestra 2:

No Solution

Resuelva el problema:
almacene G1-GM en la posición
de subíndice de N + 1-N + M; calcule el algoritmo de Dijkstra para N + 1-N + M;
proponga el tiempo más corto que la estación de servicio va a cada ciudad después de cada cálculo distancia, distancia media y una distancia más larga;
encuentran por primera vez la distancia más larga Ds es más pequeña que el área de servicio;
encontrar la distancia más corta desde la posición de la estación de gas máximo;
si la distancia más corta es la misma que la distancia mínima promedio para encontrar la ubicación final;
los especímenes para encontrar que de adelante hacia atrás Entonces, no hay necesidad de hacer juicios;

Se define una estructura, lo que resulta en una ocupación espacial relativamente grande;

#include<iostream>
#include<algorithm>
#include<math.h>
using namespace std;
#define MAXN 1020     //最大house数 
#define MAXM 11      //最大候选点数 
#define INFINITY 0x3fffffff 
//把Gi保存在N后面
int N,M,K,Ds;
int  Graph[MAXN+MAXM][MAXN+MAXM];

struct station{
	int  Maxdis=0;
	int Mindis=INFINITY;
	double Avrdis;
};
station Dijkstra(int n)  //起始下标为n 
{
	int dist[MAXN+MAXM];
	bool collected[MAXN+MAXM];
	fill(dist+1,dist+MAXN+MAXM+1,INFINITY);
	fill(collected+1,collected+1+MAXN+MAXM,0);
	
	dist[n]=0;
	
	while(1){
		//找到最小值 
		int min=INFINITY;
		int v=-1;
		for(int i=1;i<=N+M;i++)
		if(!collected[i]&&dist[i]<min)
			{
				min=dist[i];
				v=i;
			}
		//找到dist最小值
		if(v==-1) break;
		collected[v]=1;
		for(int i=1;i<=N+M;i++)
		{
			if(!collected[i]){
				if(dist[v]+Graph[v][i]<dist[i])
					dist[i]=dist[v]+Graph[v][i];	 
			}
		}		
	}
	station s;
	int sum=0;
	for(int i=1;i<=N;i++)      //判断到house的距离,不用判断到station的距离 
	{
		if(i==n) continue;
		if(s.Maxdis<dist[i]) s.Maxdis=dist[i];    //最大值 
		if(s.Mindis>dist[i]) s.Mindis=dist[i];    //最小值
		sum+=dist[i]; 
	}
	s.Avrdis=((double)sum/N);
	
	return s;
	 
}

int main()
{
		
	fill(Graph[0],Graph[0]+(MAXN+MAXM)*(MAXN+MAXM),INFINITY);
	cin>>N>>M>>K>>Ds;
	for(int i=0;i<K;i++)
	{
        string c1,c2;
        int s;
        cin>>c1>>c2>>s;
        int a,b;
        if(c1[0]=='G'){
            a=stoi(c1.substr(1))+N;
        }
        else a=stoi(c1);
        if(c2[0]=='G'){
            b=stoi(c2.substr(1))+N;
        }
        else b=stoi(c2);
        Graph[a][b]=s;
        Graph[b][a]=s;
    }                       //输入
    
	
	//Graph为各点距离
	//求每个加油站到居民区的最短距离 
	//Gi下标为i+N
	
	int maxD=-1;
	int minA=INFINITY;
	int result;
	station s1;
	
	for(int i=1;i<=M;i++){
		station s=Dijkstra(i+N);
		if(s.Maxdis>Ds) continue;    //最大值过大——找下一个点
		if(s.Mindis>maxD){      //找最小值最大的
			maxD=s.Mindis;
			result=i;
			s1=s;
		}
		if(s.Mindis==maxD) //若相等
		{
			if(s.Avrdis<s1.Avrdis) //找平均值最小的
			{	
				result=i;
				s1=s;
			}
		}
	}
	if(maxD==-1)
	printf("No Solution");
	else{
	printf("G%d\n%d.0 %.1f",result,s1.Mindis,s1.Avrdis);
}
	//首先满足最大距离不超过Ds——要得到最大值 
	//再找到G1-M中的最小距离的最大值——要得到最小值 
	//要得到平均值——平均值的最小值 
	//下标的最小值 
}

Las respuestas de ejemplo 3.3 y 3.2 son correctas para esta pregunta, no se requiere redondeo;
tenga en cuenta el
método de entrada

	cin>>N>>M>>K>>Ds;
	for(int i=0;i<K;i++)
	{
        string c1,c2;
        int s;
        cin>>c1>>c2>>s;
        int a,b;
        if(c1[0]=='G'){
            a=stoi(c1.substr(1))+N;
        }
        else a=stoi(c1);
        if(c2[0]=='G'){
            b=stoi(c2.substr(1))+N;
        }
        else b=stoi(c2);
        Graph[a][b]=s;
        Graph[b][a]=s;
    }        

Leer por tipo de cadena;
si la posición del subíndice 0 es G, el siguiente dígito es + N;
stoi también es fácil de usar;

105 artículos originales publicados · elogiados 6 · visitas 4958

Supongo que te gusta

Origin blog.csdn.net/BLUEsang/article/details/105461013
Recomendado
Clasificación