街区最短路径问题

来源:互联网 发布:请个部门悉知还是知悉 编辑:程序博客网 时间:2024/04/29 06:48
描述
一个街区有很多住户,街区的街道只能为东西、南北两种方向。

住户只可以沿着街道行走。

各个街道之间的间隔相等。

用(x,y)来表示住户坐在的街区。

例如(4,20),表示用户在东西方向第4个街道,南北方向第20个街道。

现在要建一个邮局,使得各个住户到邮局的距离之和最少。

求现在这个邮局应该建在那个地方使得所有住户距离之和最小;
输入
第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
m行后是新一组的数据;
输出
每组数据输出到邮局最小的距离和,回车结束;


解题思路:
 假设邮局坐标(a,b)     住户与邮局的距离 就是曼哈顿距离  |x-a|+|y-b|
总的就变成  各住户的x坐标 邮局a坐标  |x1-a|+|x2-a|.... +|y1-b|+|y2-b|...+|yn-b|
问题就变分解成 x、y标轴   x1 、x2.。xn 与a差的总和最小值
a  假设  位于 xm<a<Xn
|x1-a|+|x2-a|+..+|xn-a| = (a-x1)+(a-x2)+..+(a-xm)+..+(xn-a)

a 为x1、x2。。xn  最中间数x 时候 总和最小(推理证明后补充)




#include <iostream>#include <algorithm>#include <vector>using namespace std;int main(){int n;    cin >> n;while(n--){        int m;cin>>m;        vector<int> xBuf;        vector<int> yBuf;for(int i=0;i<m;i++)        {            int data;            cin >> data;            xBuf.push_back(data);            cin >> data;            yBuf.push_back(data);        }sort(xBuf.begin(),xBuf.end());sort(yBuf.begin(),yBuf.end());long sum=0;for(int i=0;i<m/2;i++)sum+=xBuf[m-1-i]-xBuf[i]+yBuf[m-1-i]-yBuf[i];cout<<sum<<endl;}return 0;}


0 0
原创粉丝点击