A1072 Gas Station (30分)

一、技术总结

  1. 第一点是关于图的编号如何处理,因为气站混合在图中,同时编号带有因为字母,所以解决办法是把气站编号依次往居民编号后加即n+1开始。需要编写getID函数,将字符变为数字的公式为int ID = 0; ID = ID * 10 + (str[i]-'0');,具体参考代码处
  2. 第二点要注意题中要求,初始结点下标是从1开始还是从0开始,从而决定i <= n还是i < n,这点尤为重要,在编写Djikstra函数时。
  3. 还有就是题中的限制条件,这一步需要我们去仔细审读题目,查看样例。

二、参考代码

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1015;
const int INF = 0x3fffffff;
int G[MAXN][MAXN], d[MAXN];
bool vis[MAXN] = {false};
int n, m, k, ds;
//avgDis是符合站点要求到每个居民家的平均距离,
//ansMax是每个站点最短距离中的最大距离
//ansID最终存放加油站ID号 
double avgDis = INF, ansMax = -1; 
int ansID = -1;
void Djikstra(int s){
	memset(vis, false, sizeof(vis));
	fill(d, d+MAXN, INF);
	d[s] = 0;
	for(int i = 0; i < n+m; i++){
		int u = -1, MIN = INF;
		for(int j = 1; j <= n+m; j++){
			if(vis[j] == false && d[j] < MIN){
				u = j;
				MIN = d[j];
			}
		}
		if(u == -1) return;
		vis[u] = true;
		for(int v = 1; v <= n+m; v++){
			if(vis[v] == false && G[u][v] != INF){
				if(d[u] + G[u][v] < d[v]){
					d[v] = d[u] + G[u][v];
				}
			}
		}
	}
} 
//将str[]转换为数字,若str是数字,则返回本身,否则返回去掉G之后的数字加上n 
int getID(char str[]){
	int i = 0, len = strlen(str), ID = 0;
	while(i < len){
		if(str[i] != 'G'){
			ID = ID * 10 + (str[i] - '0');
		}
		i++;
	} 
	if(str[0] == 'G') return n + ID;
	else return ID;
}
int main(){
	scanf("%d%d%d%d", &n, &m, &k, &ds);
	int u, v, w;
	char c1[5], c2[5];
	fill(G[0], G[0]+MAXN*MAXN, INF);
	for(int i = 1; i <= k; i++){
		scanf("%s %s %d", c1, c2, &w);
		u = getID(c1);
		v = getID(c2);
		G[v][u] = G[u][v] = w;
	}
	//遍历所有加油站 
	for(int i = n+1; i <= n+m; i++){
		double minDis = INF, avg = 0;//minDis为最大的最近距离, avg为平均距离
		Djikstra(i);
		for(int j = 1; j <= n; j++){
			if(d[j] > ds){
				minDis = -1;
				break;
			}
			if(d[j] < minDis) minDis = d[j];
			avg += 1.0 * d[j] / n;//获取平均距离 
		} 
		if(minDis == -1) continue;
		if(minDis > ansMax){//更新最大距离 
			ansID = i;
			ansMax = minDis;
			avgDis = avg;
		}else if(minDis == ansMax && avg < avgDis){
			ansID = i;
			avgDis = avg;
		} 
	}
	if(ansID == -1) printf("No Solution
");
	else{
		printf("G%d
", ansID-n);
		printf("%.1f %.1f
", ansMax, avgDis);
	} 
	return 0;	 
}
作者:睿晞
身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
原文地址:https://www.cnblogs.com/tsruixi/p/12410517.html