• 街区最短路径问题


    题目来源自http://acm.nyist.net/JudgeOnline/problem.php?pid=7

    描述一个街区有很多住户,街区的街道只能为东西、南北两种方向。

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

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

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

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

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

    求现在这个邮局应该建在那个地方使得所有住户距离之和最小;

     
    输入
    第一行一个整数n<20,表示有n组测试数据,下面是n组数据;
    每组第一行一个整数m<20,表示本组有m个住户,下面的m行每行有两个整数0<x,y<100,表示某个用户所在街区的坐标。
    m行后是新一组的数据;
    输出
    每组数据输出到邮局最小的距离和,回车结束;
    样例输入
    2
    3
    1 1
    2 1
    1 2
    5
    2 9 
    5 20
    11 9
    1 1
    1 20
    
    样例输出
    2
    44


    最短路径肯定是在这几个点所围成的圈内的,这样直接遍历求和,然后取最小值就好了,代码如下
      1 #include"header_file.h"
      2 using namespace std;
      3 
      4 int get_max(vector<int> v)
      5 {
      6     int max;
      7     max=v[0];
      8     for(int i=0;i<v.size();i++)
      9     {
     10         if(max<v[i])
     11         {
     12             max=v[i];
     13         }
     14     }
     15     return max;
     16 }
     17 
     18 int get_min(vector<int> v)
     19 {
     20     int min;
     21     min=v[0];
     22     for(int i=0;i<v.size();i++)
     23     {
     24         if(min>v[i])
     25         {
     26             min=v[i];
     27         }
     28     }
     29     return min;
     30 }
     31 
     32 int get_sum(vector<int> vx,vector<int> vy,int x,int y)
     33 {
     34     int sum=0;
     35     for(int i=0;i<vx.size();i++)
     36     {
     37         if((x-vx[i])>=0)
     38         {
     39             sum=sum+x-vx[i];
     40         }
     41         else
     42         {
     43             sum=sum+vx[i]-x;
     44         }
     45     }
     46     for(int i=0;i<vy.size();i++)
     47     {
     48         if((y-vy[i])>=0)
     49         {
     50             sum=sum+y-vy[i];
     51         }
     52         else
     53         {
     54             sum=sum+vy[i]-y;
     55         }
     56     }
     57     return sum;
     58 }
     59 
     60 int get_short_path(vector<int> vx,vector<int> vy,int m)
     61 {
     62     int vx_max,vx_min;
     63     int vy_max,vy_min;
     64     vx_max=get_max(vx);
     65     vx_min=get_min(vx);
     66     vy_max=get_max(vy);
     67     vy_min=get_min(vy);
     68     
     69     vector<int> v;
     70     for(int i=vx_min;i<=vx_max;i++)
     71     {
     72         for(int j=vy_min;j<=vy_max;j++)
     73         {
     74             int sum;
     75             sum=get_sum(vx,vy,i,j);
     76             v.push_back(sum);
     77         }
     78     }
     79     
     80     return get_min(v);
     81 }
     82 
     83 int main(void)
     84 {
     85     int m;
     86     cout<<"input m:";
     87     cin>>m;
     88     
     89     vector<int> vx,vy;
     90     
     91     for(int i=0;i<m;i++)
     92     {
     93         int x,y;
     94         cin>>x>>y;
     95         vx.push_back(x);
     96         vy.push_back(y);
     97     }
     98     
     99     cout<<get_short_path(vx,vy,m);
    100 }


  • 相关阅读:
    Java NIO使用及原理分析(二)(转)
    Java NIO使用及原理分析 (一)(转)
    虚拟机字节码执行引擎
    虚拟机类加载机制
    浅析Java中的final关键字
    java内存模型7-处理器内存模型
    java内存模型6-final
    最小生成树
    有向图的基本算法
    并查集(Union-Find)算法介绍
  • 原文地址:https://www.cnblogs.com/wswang/p/5123537.html
Copyright © 2020-2023  润新知