• 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;	 
    }
    
    作者:睿晞
    身处这个阶段的时候,一定要好好珍惜,这是我们唯一能做的,求学,钻研,为人,处事,交友……无一不是如此。
    劝君莫惜金缕衣,劝君惜取少年时。花开堪折直须折,莫待无花空折枝。
    曾有一个业界大牛说过这样一段话,送给大家:   “华人在计算机视觉领域的研究水平越来越高,这是非常振奋人心的事。我们中国错过了工业革命,错过了电气革命,信息革命也只是跟随状态。但人工智能的革命,我们跟世界上的领先国家是并肩往前跑的。能身处这个时代浪潮之中,做一番伟大的事业,经常激动的夜不能寐。”
    本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利.
  • 相关阅读:
    [MS POST]Visual Studio Tips and Tricks
    Mono
    网络编程 socket编程
    Project Properties
    Review Error Handling
    [ILDASM Boxing]从进一步了解Struct和Class的不同学到的
    Steps to Bind VS solution to Source Control
    不已0开头的数字正则
    Jquery 解决移动端onclick事件300ms延迟问题
    毫秒转换日期
  • 原文地址:https://www.cnblogs.com/tsruixi/p/12410517.html
Copyright © 2020-2023  润新知