PAT 垃圾箱分布(30分)dijstra
垃圾箱分布
大家倒垃圾的时候,都希望垃圾箱距离自己比较近,但是谁都不愿意守着垃圾箱住。所以垃圾箱的位置必须选在到所有居民点的最短距离最长的地方,同时还要保证每个居民点都在距离它一个不太远的范围内。
现给定一个居民区的地图,以及若干垃圾箱的候选地点,请你推荐最合适的地点。如果解不唯一,则输出到所有居民点的平均距离最短的那个解。如果这样的解还是不唯一,则输出编号最小的地点。
输入格式:
输入第一行给出4个正整数:N(<= 103)是居民点的个数;M(<= 10)是垃圾箱候选地点的个数;K(<= 104)是居民点和垃圾箱候选地点之间的道路的条数;DS是居民点与垃圾箱之间不能超过的最大距离。所有的居民点从1到N编号,所有的垃圾箱候选地点从G1到GM编号。
随后K行,每行按下列格式描述一条道路:
P1 P2 Dist
其中P1和P2是道路两端点的编号,端点可以是居民点,也可以是垃圾箱候选点。Dist是道路的长度,是一个正整数。
输出格式:
首先在第一行输出最佳候选地点的编号。然后在第二行输出该地点到所有居民点的最小距离和平均距离。数字间以空格分隔,保留小数点后1位。如果解不存在,则输出“No Solution”。
输入样例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
输出样例1:
G1
2.0 3.3
输入样例2:
2 1 2 10
1 G1 9
2 G1 20
输出样例2:
No Solution
详见代码,dijstra
#include <iostream>
#include <cstring>
#include <string>
#include <algorithm>
#define inf 0x3f3f3f3f
using namespace std;
int n,k,m,ds;
int e[][];
bool v[];
int d[];
int kk=;
struct node
{
int bh;
double p;
int h;
int zd;
}a[];
bool cmp(node x,node y)
{
if(x.zd==y.zd)
{
if(x.p==y.p)
return x.bh<y.bh;
else return x.p<y.p;
}
else return x.zd>y.zd;//最短距离要最长
}
void dijstra(int s)
{
int i;
memset(v,,sizeof(v));
v[s]=;
int zd=inf;
for(i=;i<=n+m;i++)
{
d[i]=e[s][i];
if(!v[i]&&i<=n&&d[i]<zd)//条件要写全
zd=d[i];
}
while()
{
int k=-;
int mm=inf;
for(i=;i<=n+m;i++)
{
if(!v[i]&&d[i]<mm)
{
k=i;
mm=d[i];
}
}
if(k==-) break;
v[k]=;
for(i=;i<=n+m;i++)
{
if(d[i]>d[k]+e[k][i])
{
d[i]=d[k]+e[k][i];
if(!v[i]&&i<=n&&d[i]<zd)
zd=d[i];//把最短的距离找出来
}
}
}
int ss=;
for(i=;i<=n;i++)
{
if(d[i]>ds) break;//最短路径超出范围的不要
else ss+=d[i];
}
if(i==n+)
{
a[kk].bh =s-n;
a[kk].h=ss;
a[kk].zd=zd;
a[kk++].p=ss*1.0/n;
}
} int main()
{
cin>>n>>m>>k>>ds;
int i,j;
for(i=;i<=n+m;i++)
for(j=;j<=n+m;j++)
{
if(i==j) e[i][j]=;
else e[i][j]=inf;
}
for(i=;i<=k;i++)
{
string a,b;//G的处理
int z;
cin>>a>>b>>z;
int x=,y=;
if(a[]!='G')
{
int l=a.length ();
for(int i=;i<l;i++)
{
x=x*+a[i]-'';
}
}
else
{
int l=a.length ();
for(int i=;i<l;i++)
{
x=x*+a[i]-'';
}
x+=n;
} if(b[]!='G')
{
int l=b.length ();
for(int i=;i<l;i++)
{
y=y*+b[i]-'';
}
}
else
{
int l=b.length ();
for(int i=;i<l;i++)
{
y=y*+b[i]-'';
}
y+=n;
}
if(e[x][y]>z)
{
e[x][y]=z;
e[y][x]=z;
}
}
for(int i=n+;i<=m+n;i++)//遍历每一个垃圾箱
{
dijstra(i);
}
if(k==) cout<<"No Solution";
else
{
sort(a+,a+kk,cmp);//排个序,是kk
if(a[].bh==) cout<<"No Solution";
else
{
cout<<"G"<<a[].bh<<endl;
printf("%.1lf",a[].zd*1.0);cout<<" ";
printf("%.1lf",a[].p);
}
} return ;
}
PAT 垃圾箱分布(30分)dijstra的更多相关文章
- PAT 甲级 1072 Gas Station (30 分)(dijstra)
1072 Gas Station (30 分) A gas station has to be built at such a location that the minimum distance ...
- PAT 甲级 1030 Travel Plan (30 分)(dijstra,较简单,但要注意是从0到n-1)
1030 Travel Plan (30 分) A traveler's map gives the distances between cities along the highways, to ...
- PAT 甲级 1018 Public Bike Management (30 分)(dijstra+dfs,dfs记录路径,做了两天)
1018 Public Bike Management (30 分) There is a public bike service in Hangzhou City which provides ...
- PAT甲级:1064 Complete Binary Search Tree (30分)
PAT甲级:1064 Complete Binary Search Tree (30分) 题干 A Binary Search Tree (BST) is recursively defined as ...
- PAT A1127 ZigZagging on a Tree (30 分)——二叉树,建树,层序遍历
Suppose that all the keys in a binary tree are distinct positive integers. A unique binary tree can ...
- 【PAT】1053 Path of Equal Weight(30 分)
1053 Path of Equal Weight(30 分) Given a non-empty tree with root R, and with weight Wi assigned t ...
- 【PAT】1091 Acute Stroke(30 分)
1091 Acute Stroke(30 分) One important factor to identify acute stroke (急性脑卒中) is the volume of the s ...
- [PAT] 1147 Heaps(30 分)
1147 Heaps(30 分) In computer science, a heap is a specialized tree-based data structure that satisfi ...
- [PAT] 1143 Lowest Common Ancestor(30 分)
1143 Lowest Common Ancestor(30 分)The lowest common ancestor (LCA) of two nodes U and V in a tree is ...
随机推荐
- Harbor 镜像管理专家
Harbor是一个企业级的镜像管理仓库,是VMware主导的一个开源项目(github地址:https://github.com/vmware/harbor). Harbor提供了以下功能特性: Cl ...
- MongoDB快速入门(一)
MongoDB是一个跨平台,面向文档的数据库,提供高性能,高可用性和易于扩展.MongoDB是工作在集合和文档上一种概念. 数据数 数据库是一个集合的物理容器.每个数据库获取其自己设定在文件系统上的文 ...
- jsp中的basePath和path(绝对路径 相对路径)
在JSP中的如果使用 "相对路径" 则有 可能会出现问题. 因为 网页中的 "相对路径" , 他是相对于 "URL请求的地址" 去寻找资源. ...
- Mac键盘图标与对应快捷按键标志汇总 分类
Mac键盘图标与对应快捷按键 ⌘——Command () win键 ⌃ ——Control ctrl键 ⌥——Option (alt) ⇧——Shift ⇪——Caps Lock fn——功能键就是 ...
- Spring初学之通过工厂方法配置Bean
工厂方法配置bean分为两种,一种是实例工厂方法,另一种是静态工厂方法. 先来看看实体bean: Car.java: package spring.beans.factory; public clas ...
- 查找和删除倒数第n个节点的问题
class ListNode { int val; ListNode next; ListNode(int x) { val = x; } } public class NthNodeFromEnd ...
- js+css实现简单下拉菜单
<head> <meta http-equiv="Content-Type" content="text/html; charset=gb2312&qu ...
- 在win+r中常用的命令
cmd打开命令提示符 regedit打开注册表 gpedit.msc组策略 services.msc打开服务列表 msconfig系统配置(可以设置开机自启动) compmgmt.msc 计算机管理 ...
- bootstrap参考网站
http://www.chuntao.org.cn/http://www.dianxiaohuo.com/
- 为mac终端添加tree命令
原文:http://superuser.com/questions/359723/mac-os-x-equivalent-of-the-ubuntu-tree-command/ 整理步骤如下: $ t ...