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 ...
随机推荐
- 斯坦福机器学习视频笔记 Week6 关于机器学习的建议 Advice for Applying Machine Learning
我们将学习如何系统地提升机器学习算法,告诉你学习算法何时做得不好,并描述如何'调试'你的学习算法和提高其性能的“最佳实践”.要优化机器学习算法,需要先了解可以在哪里做最大的改进. 我们将讨论如何理解具 ...
- <转>xshell的快捷键
xshell中现有的快捷键 快捷方式键 说明 Alt + N 与文件菜单的新建相同 Alt + O 与文件菜单的打开相同 Alt + C 与文件菜单的断开相同 Alt + Enter 切换到全屏模式 ...
- Caused by: org.apache.ibatis.binding.BindingException: Parameter 'parameter' not found.解决
Caused by: org.apache.ibatis.binding.BindingException: Parameter 'company' not found. Available para ...
- XE8_TPaintBox画
1. procedure TForm1.PaintBox1Paint(Sender: TObject; Canvas: TCanvas); var bitmap :TBitMap; pt1, pt2 ...
- 自己编写each函数
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- jmeter-察看结果树-响应数据,中文显示乱码问题处理
第一步: 打开路径:jmeter\bin\jmeter.properties 文件 第二步: 文件中默认编码为:ISO-8859-1 修改为utf-8 sampleresult.default.enc ...
- tar 或 7z 备份项目
mac, tar #!/bin/sh projPath=~/Developer projName=youku now=`date +%Y-%m-%d-%H-%M-%S` output=$projNam ...
- Django-03
知识预览 分页器(paginator) COOKIE 与 SESSION Django的用户认证 FORM 回到顶部 分页器(paginator) 分页器的使用 1 2 3 4 5 6 7 8 9 1 ...
- LeetCode OJ:Same Tree(相同的树)
Given two binary trees, write a function to check if they are equal or not. Two binary trees are con ...
- Memorial for Nanjing victims today 南京大屠杀死难者公祭仪式今于南京举行 勿忘国耻,活捉小*日*本。
China will hold an annual memorial for the victims of the Nanjing Massacre today in the eastern city ...