ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

1072 Gas Station

2020-03-09 17:51:28  阅读:219  来源: 互联网

标签:ansAvg minDis int Gas 1072 加油站 Station maxn ansDis


大致题意就是给出 N 个房屋,M个加油站,K 个房屋(加油站)与房屋(加油站)之间的距离,以及加油站的最大服务距离DS。要求找到这样的加油站,即所有房屋处在其服务范围内,并且离该加油站最近的房屋的距离,在其它方案中的是最大的最近距离;如果该最近距离相同,那么要求该加油站距离所有房屋的平均距离最小;如果仍然相同,那么选择最小的加油站编号。

 1 #include<iostream>
 2 #include<algorithm>
 3 using namespace std;
 4 const int maxn = 1020;
 5 const int inf = 1000000000;
 6 int N,M,K,DS,G[maxn][maxn];
 7 bool visited[maxn] = {false};
 8 int d[maxn];
 9 
10 void Dijkstra(int s) {
11     fill(visited,visited+maxn,false);//初始化 
12     fill(d,d+maxn,inf);
13     d[s] = 0;
14     for(int i = 0; i < N+M; ++i) {
15         int u = -1, MIN = inf;
16         for(int j = 1; j <= N+M; ++j) {
17             if(visited[j] == false && d[j] < MIN) {
18                 u = j;
19                 MIN = d[j];
20             }
21         }
22         if(u == -1) return ;
23         visited[u] = true;
24         for(int v = 1; v <= N+M; ++v) {
25             if(visited[v] == false && G[u][v] != inf)
26                 if(d[u] + G[u][v] < d[v])
27                     d[v] = d[u] + G[u][v];
28         }
29     }
30 }
31 
32 int getId(string str) {
33     if(str[0] == 'G') return stoi(str.substr(1,-1))+N;
34     return stoi(str);
35 }
36 
37 int main() {
38     cin>>N>>M>>K>>DS;
39     fill(G[0],G[0]+maxn*maxn,inf);
40     string c1,c2;
41     for(int i = 0; i < K; ++i) {
42         cin>>c1>>c2;
43         int u = getId(c1);
44         int v = getId(c2);
45         cin>>G[u][v];
46         G[v][u] = G[u][v];
47     }
48     double ansDis = -1,ansAvg = inf;
49     int ansID = -1;
50     for(int i = N+1; i <= N+M; ++i) { //枚举所有 加油站G
51         double minDis = inf,avg = 0;
52         Dijkstra(i);
53         for(int j = 1; j <= N; ++j) { //枚举所有 房屋,找到房屋到加油站的最短距离
54             if(d[j] > DS) { //存在,超出加油站的服务范围
55                 minDis = -1;
56                 break;
57             }
58             if(d[j] < minDis) minDis = d[j];
59             avg += 1.0*d[j]/N;
60         }
61         if(minDis == -1) continue;
62         if(minDis > ansDis) { //更新最大的最短距离
63             ansDis = minDis;
64             ansID = i;
65             ansAvg = avg;
66         } else if(ansDis == minDis && avg < ansAvg) {
67             ansID = i;
68             ansAvg = avg;
69         }
70     }
71     if(ansID == -1) printf("No Solution");
72     else printf("G%d\n%.1f %.1f",ansID-N,ansDis,ansAvg);
73     return 0;
74 }

 

标签:ansAvg,minDis,int,Gas,1072,加油站,Station,maxn,ansDis
来源: https://www.cnblogs.com/keep23456/p/12450011.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有