街区最短路径问题-ny-7

街区最短路径问题

时间限制:3000 ms  |  内存限制:65535 KB

难度:4

描述

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

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

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

用(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、  求最短路径,可以把数据分成两组,一个东西街道,一个南北街道。

2、  分别找两个数组的中位数。

3、  每个数据到中位数的距离和,就是最短路径之和。

程序代码:

#include<stdio.h>

#include<math.h>

#include<stdlib.h>

int cmp(const void *a,const void *b)

{

    return *(int*)a - *(int*)b;

}

int main()

{

    int x[110],y[110],n,m,i,j,s;

    while(scanf("%d",&n)!=EOF)

    {

        while(n--)

        {

            scanf("%d",&m);

            for(i=0;i<m;i++)

            {

                scanf("%d %d",&x[i],&y[i]);

            }

            qsort(x,m,sizeof(x[0]),cmp);          // 排序

            qsort(y,m,sizeof(y[0]),cmp);

           // for(i=0; i<m;i++)

           // printf("%d ",x[i]);

           s=0;

           for(i=0; i<m;i++)

            s=s+fabs(x[i]-x[m/2])+fabs(y[i]-y[m/2]);               //找出中位数,然后到中位数的距离之和

            printf("%d ",s);

        }

    }

    return 0;

}

原文地址:https://www.cnblogs.com/zhouhongweihpu/p/3238643.html