题意:从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内。
如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个。
如果平均值还是一样,就输出按照顺序排列加油站编号最小的。

分析:
加油站之间也是彼此有路连接的,所以最短路径计算的时候也要把加油站算上,是双向边,所以边的数组大小得开两倍。
加油站编号记为n+1~n+m,对这些点用dijkstra计算最短路径即可,这里顺便在dijkstra中进行了剪枝处理,不剪枝也没事。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <string.h>
#include <queue>
#define INF 0X3f3f3f3f
using namespace std;
/*
从m个加油站里面选取1个站点,使得其离住宅的最近距离mindis尽可能地远,并且离所有住宅的距离都在服务范围ds之内。
如果有很多相同mindis的加油站,输出距所有住宅平均距离最小的那个。
如果平均值还是一样,就输出按照顺序排列加油站编号最小的。
分析:
加油站之间也是彼此有路连接的,所以最短路径计算的时候也要把加油站算上,是双向边,所以边的数组大小得开两倍。
加油站编号记为n+1~n+m,对这些点用dijkstra计算最短路径即可,这里顺便在dijkstra中进行了剪枝处理,不剪枝也没事。
*/
const int maxn=+;
int dis[maxn];
int vis[maxn];
int head[maxn];
int tot=;
int mindis;
struct Node{
int u;
int dis;
bool operator<(const Node tmp)const{
return dis>tmp.dis;
}
}; struct Edge{
int to;
int next;
int dist;
}edge[*]; void add(int u,int v,int dist){
edge[tot].to=v;
edge[tot].dist=dist;
edge[tot].next=head[u];
head[u]=tot++;
}
void init(){
memset(head,-,sizeof(head));
tot=;
}
bool dijkstra(int s,int n){
for(int i=;i<maxn;i++){
dis[i]=INF;
vis[i]=;
}
priority_queue<Node>q;
Node st,t;
st.u=s;
st.dis=;
dis[s]=;
q.push(st);
bool first=true;
while(!q.empty()){
st=q.top();
q.pop();
vis[st.u]=;
if(first && <=st.u && st.u<=n){
if(dis[st.u]<mindis){
return false; //剪枝,即离车站最小的距离比目前的mindis还要小,直接返回即可
}
first=false;
}
for(int k=head[st.u];k!=-;k=edge[k].next){
int v=edge[k].to;
if(!vis[v] && dis[st.u]+edge[k].dist<dis[v]){
dis[v]=dis[st.u]+edge[k].dist;
t.u=v;
t.dis=dis[v];
q.push(t);
}
}
}
return true;
}
int main()
{
int n,m,k,ds;
char str1[],str2[];
int u,v,dist;
scanf("%d %d %d %d",&n,&m,&k,&ds);
init();
for(int i=;i<k;i++){
scanf("%s %s %d",str1,str2,&dist);
if(str1[]=='G')
u=atoi(str1+)+n;
else
u=atoi(str1);
if(str2[]=='G')
v=atoi(str2+)+n;
else
v=atoi(str2);
add(u,v,dist);
add(v,u,dist);
}
mindis=;
double avgdis=INF;
int gasid=;
bool noAns=true;
for(int i=;i<=m;i++){
//如果最小距离小于目前的mindis,直接跳过
if(!dijkstra(n+i,n)){
continue;
}
dist=INF;
int sum=;
bool flag=true;
for(int j=;j<=n;j++){
//有超出服务范围的
if(dis[j]>ds){
flag=false;
break;
}
dist=min(dist,dis[j]);
sum+=dis[j];
}
if(!flag)
continue;
else
noAns=false;
double avg=sum*1.0/n;
if(dist>mindis){
gasid=i;
mindis=dist;
avgdis=avg;
}
else if(dist==mindis){
if(avg<avgdis){
gasid=i;
avgdis=avg;
}
}
}
if(noAns)
printf("No Solution\n");
else
printf("G%d\n%.1lf %.1lf\n",gasid,(double)mindis,avgdis);
return ;
}

PAT甲题题解-1072. Gas Station (30)-dijkstra最短路的更多相关文章

  1. 1072. Gas Station (30)【最短路dijkstra】——PAT (Advanced Level) Practise

    题目信息 1072. Gas Station (30) 时间限制200 ms 内存限制65536 kB 代码长度限制16000 B A gas station has to be built at s ...

  2. PAT Advanced 1072 Gas Station (30) [Dijkstra算法]

    题目 A gas station has to be built at such a location that the minimum distance between the station an ...

  3. PAT甲题题解-1030. Travel Plan (30)-最短路+输出路径

    模板题最短路+输出路径如果最短路不唯一,输出cost最小的 #include <iostream> #include <cstdio> #include <algorit ...

  4. PAT甲题题解-1103. Integer Factorization (30)-(dfs)

    该题还不错~. 题意:给定N.K.P,使得可以分解成N = n1^P + … nk^P的形式,如果可以,输出sum(ni)最大的划分,如果sum一样,输出序列较大的那个.否则输出Impossible. ...

  5. PAT甲题题解-1004. Counting Leaves (30)-统计每层叶子节点个数+dfs

    统计每层的叶子节点个数建树,然后dfs即可 #include <iostream> #include <cstdio> #include <algorithm> # ...

  6. PAT甲题题解-1022. Digital Library (30)-map映射+vector

    博主欢迎转载,但请给出本文链接,我尊重你,你尊重我,谢谢~http://www.cnblogs.com/chenxiwenruo/p/6789235.html特别不喜欢那些随便转载别人的原创文章又不给 ...

  7. PAT甲题题解-1091. Acute Stroke (30)-BFS

    题意:给定三维数组,0表示正常,1表示有肿瘤块,肿瘤块的区域>=t才算是肿瘤,求所有肿瘤块的体积和 这道题一开始就想到了dfs或者bfs,但当时看数据量挺大的,以为会导致栈溢出,所以并没有立刻写 ...

  8. PAT甲题题解-1107. Social Clusters (30)-PAT甲级真题(并查集)

    题意:有n个人,每个人有k个爱好,如果两个人有某个爱好相同,他们就处于同一个集合.问总共有多少个集合,以及每个集合有多少人,并按从大到小输出. 很明显,采用并查集.vis[k]标记爱好k第一次出现的人 ...

  9. PAT甲题题解-1111. Online Map (30)-PAT甲级真题(模板题,两次Dijkstra,同时记下最短路径)

    题意:给了图,以及s和t,让你求s到t花费的最短路程.最短时间,以及输出对应的路径.   对于最短路程,如果路程一样,输出时间最少的. 对于最短时间,如果时间一样,输出节点数最少的.   如果最短路程 ...

随机推荐

  1. windows的一些好用命令-自己总结:

    在win+R运行框中:     cmd:进入命令行界面     msconfig:可以查看“系统配置”     msinfo32:查看系统信息     services.msc打开"服务&q ...

  2. MySQL C API 访问 MySQL 示例

    代码: /* Simple C program that connects to MySQL Database server */ #include <mysql.h> #include ...

  3. Alpha冲刺&总结报告(12/12)(麻瓜制造者)

    各个成员今日完成的任务 邓弘立: 完成了上传头像的功能 符天愉: 对所有接口进行了再次测试 江郑: 完成了发布需求接口部分的进一步测试和接口文档的编写 刘双玉: 完成了商品信息接口部分的进一步测试和接 ...

  4. 二、git版本回退

    查看历史版本提交记录 git log git log --pretty=oneline Git用 HEAD表示当前版本 commit id(版本号),也就是最新的提交e4aa53d...43ae6f6 ...

  5. 将Vue-cli搭建的项目改造成多页面应用时对项目结构和配置的调整

    创建项目 首先初始化一个Vue项目模板,之后在模板下载时候会弹出如下配置选项 vue init webpack demo 配置好后按下回车就构建完成了Vue脚手架,之后cd进入项目,并且进行node模 ...

  6. python+requests实现接口测试 - cookies的使用 (转载)

    出自:https://www.cnblogs.com/nizhihong/p/6699492.html 在很多时候,发送请求后,服务端会对发送请求方进行身份识别,如果请求中缺少识别信息或存在错误的识别 ...

  7. scrapy (四)基本配置

    scrapy使用细节配置 一.建立项目 1.scrapy startproject 项目名字 2.进入项目: scrapy genspider 名字 不带http的根网址 3.默认模板(或改变模板) ...

  8. ETH—Lwip以太网通信

    第39章     ETH—Lwip以太网通信 全套200集视频教程和1000页PDF教程请到秉火论坛下载:www.firebbs.cn 野火视频教程优酷观看网址:http://i.youku.com/ ...

  9. .NetCore Session.Redis (转载)

    首先创建ASP.NET CORE Web项目,然后按如下顺序操作. 1.添加nuget程序包: Microsoft.AspNetCore.Session; Microsoft.AspNetCore.D ...

  10. 【js】AddFavorite/SetHome提醒用户自行操作加入收藏/设置主页

    除了老版本的ie, 就已经没有浏览器能支持js添加收藏夹和设置首页, 浏览器没有开放这个权限了,external.addFavorite这个给禁了. 不过AddFavorite可以起到提醒用户自行操作 ...