L'algorithme C Dijkstra a utilisé la station-service 1072 plusieurs fois (30 points)

1072 Station-service (30 points)

Une station-service doit être construite à un endroit tel que la distance minimale entre la station et tout logement résidentiel soit aussi éloignée que possible. Cependant, il doit garantir que toutes les maisons sont dans sa gamme de services.

Maintenant, étant donné la carte de la ville et plusieurs emplacements candidats pour la station-service, vous êtes censé donner la meilleure recommandation. S'il y a plus d'une solution, sortez celle avec la plus petite distance moyenne à toutes les maisons. Si une telle solution n'est toujours pas unique, sortez celle avec le plus petit numéro d'index.

Spécification d'entrée:
Chaque fichier d'entrée contient un cas de test. Pour chaque cas, la première ligne contient 4 entiers positifs: N (≤10
3
), le nombre total de maisons; M (≤10), le nombre total d'emplacements candidats pour les stations-service; K (≤10
4
), le nombre de routes reliant les maisons et les stations-service; et D
S
, la portée maximale de service de la station-service. On suppose donc que toutes les maisons sont numérotées de 1 à N, et tous les emplacements candidats sont numérotés de G1 à GM.

Puis K lignes suivent, chacune décrit une route au format

P1 P2 Dist

où P1 et P2 sont les deux extrémités d'une route qui peuvent être des numéros de maison ou des stations-service, et Dist est la longueur entière de la route.

Spécification de sortie:
pour chaque scénario de test, imprimez sur la première ligne le numéro d'index du meilleur emplacement. Dans la ligne suivante, imprimez les distances minimales et moyennes entre la solution et toutes les maisons. Les nombres sur une ligne doivent être séparés par un espace et être précis jusqu'à 1 décimale. Si la solution n'existe pas, affichez simplement No Solution.

Exemple d'entrée 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

Exemple de sortie 1:

G1
2.0 3.3

Exemple d'entrée 2:

2 1 2 10
1 G1 9
2 G1 20

Exemple de sortie 2:

No Solution

Résoudre le problème.
Stocker G1-GM dans la position en indice
de N + 1-N + M; calculer l'algorithme de Dijkstra pour N + 1-N + M;
proposer le temps le plus court que la station-service se rend dans chaque ville après chaque calcul la distance, la distance moyenne et une plus longue distance,
première rencontre la plus longue distance Ds est plus petite que la zone de service,
trouver la distance la plus courte de la position de la station de gaz maximale,
si la distance la plus courte est la même que la distance minimale moyenne pour trouver l'emplacement final,
les spécimens trouvent d'avant en arrière , Donc pas besoin de porter des jugements;

Une structure est définie, entraînant une occupation de l'espace relativement importante;

#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中的最小距离的最大值——要得到最小值 
	//要得到平均值——平均值的最小值 
	//下标的最小值 
}

Les exemples de réponses 3.3 et 3.2 sont corrects pour cette question, aucun arrondi n'est requis;
notez la
méthode de saisie

	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;
    }        

Lecture par type de chaîne;
si la position de l'indice 0 est G, le chiffre suivant est + N;
stoi est également facile à utiliser;

Publié 105 articles originaux · loué 6 · visites 4958

Je suppose que tu aimes

Origine blog.csdn.net/BLUEsang/article/details/105461013
conseillé
Classement