PAT 1072. Gas Station (30)(多个点的最短路径)

来源:互联网 发布:淘宝买大麻种植暗语 编辑:程序博客网 时间:2024/06/03 15:56

官网

1072. Gas Station (30)

时间限制
200 ms
内存限制
65536 kB
代码长度限制
16000 B
判题程序
Standard
作者
CHEN, Yue
A gas station has to be built at such a location that the minimum distance between the station and any of the residential housing is as far away as possible. However it must guarantee that all the houses are in its service range.

Now given the map of the city and several candidate locations for the gas station, you are supposed to give the best recommendation. If there are more than one solution, output the one with the smallest average distance to all the houses. If such a solution is still not unique, output the one with the smallest index number.

Input Specification:

Each input file contains one test case. For each case, the first line contains 4 positive integers: N (<= 103), the total number of houses; M (<= 10), the total number of the candidate locations for the gas stations; K (<= 104), the number of roads connecting the houses and the gas stations; and DS, the maximum service range of the gas station. It is hence assumed that all the houses are numbered from 1 to N, and all the candidate locations are numbered from G1 to GM.

Then K lines follow, each describes a road in the format
P1 P2 Dist
where P1 and P2 are the two ends of a road which can be either house numbers or gas station numbers, and Dist is the integer length of the road.

Output Specification:

For each test case, print in the first line the index number of the best location. In the next line, print the minimum and the average distances between the solution and all the houses. The numbers in a line must be separated by a space and be accurate up to 1 decimal place. If the solution does not exist, simply output “No Solution”.

Sample Input 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
Sample Output 1:
G1
2.0 3.3
Sample Input 2:
2 1 2 10
1 G1 9
2 G1 20
Sample Output 2:
No Solution

题目大意


  • 1.给出几个候选加油站,求使:

  • 1.到所有居住点的最近的人家越远越好。
  • 2.到每家每户的平均距离越小越好。
  • 3.如果还相同就取序号最小的。

解题思路

  • 1.对每个加油站dijkstra即可。

AC代码

#include<iostream>#include<string>#include<vector>#include<math.h>#include<algorithm>#include<map>#include<sstream>#include<cstdio>using namespace std;#define INF 0x3f3f3f3fint n, m, k, ds;//路径的题,road初始为0int road[1011][1011];int visited[1011];//dist初始为INFint dist[1011];void Dijkstra(int now){    visited[now] = 1;    for (int i = 1; i <= n + m; i++){        if (road[now][i] > 0 && dist[now] + road[now][i]<dist[i])        {            dist[i] = dist[now] + road[now][i];        }    }    //找到距离距离最短的未访问过的点去访问    int minDist = INF, minId = -1;    for (int i = 1; i <= n + m; i++){        if (visited[i] != 1 && dist[i] < minDist){            minDist = dist[i];            minId = i;        }    }    if (minId != -1){        Dijkstra(minId);    }}struct station{    int id;    double sum, per, minDist;    station(int _id,double _s, double _p, double _m) :id(_id),sum(_s), per(_p), minDist(_m){}};bool cmp(const station &a, const station &b){    if (a.minDist != b.minDist){        return a.minDist > b.minDist;    }    else if (a.per != b.per){        return a.per < b.per;    }    else{        return a.id < b.id;    }}int main(){    cin >> n >> m >> k >> ds;    string w, t; int l, r, v;     for (int i = 0; i < k; i++){        cin >> w >> t >> v;        if (w[0] == 'G'){            stringstream ss;            w = w.substr(1);            ss << w; ss >> l;            l += n;        }        else{            stringstream ss;            ss << w; ss >> l;        }        if (t[0] == 'G'){            stringstream ss;            t = t.substr(1);            ss << t;            ss >> r;            r += n;        }        else{            stringstream ss;            ss << t; ss >> r;        }        road[l][r] = road[r][l] = v;    }    vector<station> keep;    for (int j = 1; j <= m; j++){        fill(dist, dist + 1011, INF);        fill(visited, visited + 1011, 0);        dist[n + j] = 0;        Dijkstra(n + j);        double sum = 0;        bool isInRange = true;        double minDist = INF;        for (int i = 1; i <= n; i++){            //范围内            if (dist[i] > ds){                isInRange = false;                break;            }            //最小距离越大越好            if (dist[i] > 0 && dist[i] < minDist){                minDist = dist[i];            }            //平均值越小越好            sum += dist[i];        }        if (isInRange){            keep.push_back(station(j, sum, sum / (double)n, minDist));        }    }    if (keep.empty()){        cout << "No Solution" << endl;    }    else{        sort(keep.begin(), keep.end(), cmp);        printf("G%d\n", keep[0].id);        printf("%.1f %.1f\n", keep[0].minDist, keep[0].per);    }    return 0;}
0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 监狱对死缓犯人延长转为无期怎么办 手机号码办理的宽带不想要了怎么办 朋友诈骗罪被关看守所了该怎么办 打架被拘留家里有孩子没人看怎么办 刑事拘留满37天给逮捕了怎么办 因打架被拘留十五天释放后会怎么办 犯罪人在拘留所生了小孩怎么办 我申请了进京证更换车辆怎么办 丈夫去世前想把财产留给妻子怎么办 假货中通代收货款发现是假货怎么办 注册志愿者时身份证被使用该怎么办 双眼皮贴贴的皮肤送了怎么办? 满60岁社保末满十五年怎么办 眼角膜少了一块怎么办应该吃什么 左右胸相差一个罩杯左右怎么办 穿一字肩的裙子没有无肩内衣怎么办 农业网柑橘被奄24小时怎么办 钱包被偷了小偷抓到了钱不认怎么办 快高考了很想学却没有动力怎么办? 孩子高三了学习状态不好怎么办 离婚时对方说把钱都花了怎么办 挂科太多学校不给毕业证怎么办 大专挂科太多学校让延期毕业怎么办 安卓手机老是收到垃圾短信怎么办 高铁站行李拉安检仪上应该怎么办 连壁金融立案了投资钱怎么办 联壁金融倒了投资人的钱怎么办 改签的高铁票错过了怎么办 高铁票错过了当天没别的车次怎么办 电脑文件剪切到u盘不见了怎么办 电脑剪切到u盘然后打不开了怎么办 淘宝未满十八岁限制购买物品怎么办 网上飞机订票手机号填写错了怎么办 室外回填土都是砂土压不实怎么办 王牌车新车储气筒漏气查不到怎么办 顺丰快递保价后商品出现问题怎么办 未保价快递丢失没有价值证明怎么办 安卓手机谷歌地图怎么用不了怎么办 ae模板版本太高打不开怎么办 苹果手机高德地图信号弱怎么办 网上订好火车票后没赶上火车怎么办