216 - Getting in Line

Computer networking requires that the computers in the network be linked.

This problem considers a ``linear" network in which the computers are chained together so that each is connected to exactly two others except for the two computers on the ends of the chain which are connected to only one other computer. A picture is shown below. Here the computers are the black dots and their locations in the network are identified by planar coordinates (relative to a coordinate system not shown in the picture).

Distances between linked computers in the network are shown in feet.

For various reasons it is desirable to minimize the length of cable used.

Your problem is to determine how the computers should be connected into such a chain to minimize the total amount of cable needed. In the installation being constructed, the cabling will run beneath the floor, so the amount of cable used to join 2 adjacent computers on the network will be equal to the distance between the computers plus 16 additional feet of cable to connect from the floor to the computers and provide some slack for ease of installation.

The picture below shows the optimal way of connecting the computers shown above, and the total length of cable required for this configuration is (4+16)+ (5+16) + (5.83+16) + (11.18+16) = 90.01 feet.

Input

The input file will consist of a series of data sets. Each data set will begin with a line consisting of a single number indicating the number of computers in a network. Each network has at least 2 and at most 8 computers. A value of 0 for the number of computers indicates the end of input.

After the initial line in a data set specifying the number of computers in a network, each additional line in the data set will give the coordinates of a computer in the network. These coordinates will be integers in the range 0 to 150. No two computers are at identical locations and each computer will be listed once.

Output

The output for each network should include a line which tells the number of the network (as determined by its position in the input data), and one line for each length of cable to be cut to connect each adjacent pair of computers in the network. The final line should be a sentence indicating the total amount of cable used.

In listing the lengths of cable to be cut, traverse the network from one end to the other. (It makes no difference at which end you start.) Use a format similar to the one shown in the sample output, with a line of asterisks separating output for different networks and with distances in feet printed to 2 decimal places.

Sample Input

6
5 19
55 28
38 101
28 62
111 84
43 116
5
11 27
84 99
142 81
88 30
95 38
3
132 73
49 86
72 111
0

Sample Output

**********************************************************
Network #1
Cable requirement to connect (5,19) to (55,28) is 66.80 feet.
Cable requirement to connect (55,28) to (28,62) is 59.42 feet.
Cable requirement to connect (28,62) to (38,101) is 56.26 feet.
Cable requirement to connect (38,101) to (43,116) is 31.81 feet.
Cable requirement to connect (43,116) to (111,84) is 91.15 feet.
Number of feet of cable required is 305.45.
**********************************************************
Network #2
Cable requirement to connect (11,27) to (88,30) is 93.06 feet.
Cable requirement to connect (88,30) to (95,38) is 26.63 feet.
Cable requirement to connect (95,38) to (84,99) is 77.98 feet.
Cable requirement to connect (84,99) to (142,81) is 76.73 feet.
Number of feet of cable required is 274.40.
**********************************************************
Network #3
Cable requirement to connect (132,73) to (72,111) is 87.02 feet.
Cable requirement to connect (72,111) to (49,86) is 49.97 feet.
Number of feet of cable required is 136.99.
题意:把所有电脑连成一条线,使得所用的电缆总长度最小。
两台电脑之间由一条缆线连接, 缆线的长度除了这两点间的直线长度,还要额外加上16米长。
一、暴力法
不同的方案就是不同的连接顺序,暴力枚举所有的方案,求出所有方案所用的电缆长度,求出一种长度最短的方案。设每台电脑的编号依次为0,1,2,……,n-1,根据连接顺序,利用STL里面的next_permutation函数求出0~n-1的全排列,每一种排列对应一种连接方案。因为最大只有8台电脑,所以数据量比较小,可以实现。
#include<stdio.h>
#include<math.h>
#include<string.h>
#include<algorithm>
using namespace std;
struct cable
{
double x,y;
}a[10]; /*保存坐标*/
int b[10],c[10];
double length(double x1,double y1,double x2,double y2) /*求两点之间距离*/
{
double L=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2));
return L;
}
int main()
{
double sum,min,l;
int n,i,cases=0;
while(~scanf("%d",&n)&&n)
{
for(i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
b[i]=i;
}
min=2147483645;
do
{
sum=0;
for(i=0;i<n-1;i++)
{
l=length(a[b[i]].x,a[b[i]].y,a[b[i+1]].x,a[b[i+1]].y)+16;
sum+=l;
}
if(sum<min)
{
min=sum;
for(i=0;i<n;i++)
c[i]=b[i]; //可用 memcpy(c,b,sizeof(b)) 代替
}
}while(next_permutation(b,b+n));
printf("**********************************************************\n");
printf("Network #%d\n",++cases);
for(i=0;i<n-1;i++)
{
l=length(a[c[i]].x,a[c[i]].y,a[c[i+1]].x,a[c[i+1]].y)+16;
printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet.\n",a[c[i]].x,a[c[i]].y,a[c[i+1]].x,a[c[i+1]].y,l);
}
printf("Number of feet of cable required is %.2lf.\n",min);
}
return 0;
}

因为next_permutation是C++里面的函数,所以提交时要选择C++语言,不然会编译错误。

二、回溯法
暴力很容易想到,但是不太灵活,也并不是所有都适用的。

而回溯法是更常用的方法,也更加灵活,更难掌握。

回溯法就是深搜(DFS)的变形。 一般深搜是要访问所有的解答树的,而回溯也是把问题分成若干步骤并递归求解,但是如果当前步骤已经不是最佳选择的

话,就不继续递归下去,而是返回上一及的递归调用。这样就可以节省很多的时间,而不必徒劳去访问那些“不归路”。

#include<stdio.h>
#include<string.h>
#include<math.h>
struct cable
{
double x,y;
}a[10];
int b[10],c[10],vis[10],n;
double min,sum,l;
double length(double x1,double y1,double x2,double y2)
{
double L=sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))+16;
return L;
}
void dfs(int cur,double sum)
{
int i;
if(cur==n)
{
if(sum<min)
{
min=sum;
memcpy(c,b,sizeof(b));
}
return;
}
if(sum>=min) return;
for(i=0;i<n;i++)
{
if(vis[i]) continue;
vis[i]=1;
b[cur]=i;
if(cur==0)
dfs(cur+1,0);
else
{
l=length(a[b[cur]].x,a[b[cur]].y,a[b[cur-1]].x,a[b[cur-1]].y);
dfs(cur+1,sum+l);
}
vis[i]=0;
}
}
int main()
{
int cases=0,i;
while(~scanf("%d",&n)&&n)
{
memset(vis,0,sizeof(vis));
for(i=0;i<n;i++)
{
scanf("%lf%lf",&a[i].x,&a[i].y);
b[i]=i;
}
min=99999999;
dfs(0,0);
printf("**********************************************************\n");
printf("Network #%d\n",++cases);
for(i=1;i<n;i++)
{
l=length(a[c[i-1]].x,a[c[i-1]].y,a[c[i]].x,a[c[i]].y);
printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet.\n",a[c[i-1]].x,a[c[i-1]].y,a[c[i]].x,a[c[i]].y,l);
}
printf("Number of feet of cable required is %.2lf.\n",min);
}
return 0;
}

UVA 216 - Getting in Line的更多相关文章

  1. uva 216 Getting in Line 最短路,全排列暴力做法

    题目给出离散的点,要求求出一笔把所有点都连上的最短路径. 最多才8个点,果断用暴力求. 用next_permutation举出全排列,计算出路程,记录最短路径. 这题也可以用dfs回溯暴力,但是用最小 ...

  2. UVa 216 Getting in Line【枚举排列】

    题意:给出n个点的坐标,(2<=n<=8),现在要使得这n个点连通,问最小的距离的和 因为n很小,所以可以直接枚举这n个数的排列,算每一个排列的距离的和, 保留下距离和最小的那个排列就可以 ...

  3. Getting in Line UVA 216

     Getting in Line  Computer networking requires that the computers in the network be linked. This pro ...

  4. UVA题目分类

    题目 Volume 0. Getting Started 开始10055 - Hashmat the Brave Warrior 10071 - Back to High School Physics ...

  5. codeforces 713B B. Searching Rectangles(二分)

    题目链接: B. Searching Rectangles time limit per test 1 second memory limit per test 256 megabytes input ...

  6. Python写出LSTM-RNN的代码

    0. 前言 本文翻译自博客: iamtrask.github.io ,这次翻译已经获得trask本人的同意与支持,在此特别感谢trask.本文属于作者一边学习一边翻译的作品,所以在用词.理论方面难免会 ...

  7. Codeforces Round #371 (Div. 2) D. Searching Rectangles 交互题 二分

    D. Searching Rectangles 题目连接: http://codeforces.com/contest/714/problem/D Description Filya just lea ...

  8. hdu 5735 Born Slippy 暴力

    Born Slippy 题目连接: http://acm.hdu.edu.cn/showproblem.php?pid=5735 Description Professor Zhang has a r ...

  9. 转:西部数据NAS设备hack

    通过该文学习一下常见硬件web漏洞.重点关注一下几个方面: 1.登录验证代码: 2.文件上传代码: 3.system/exec/popen等是否存在注入可能: 4.调用二进制文件: 5.未登陆可以访问 ...

随机推荐

  1. 使用gson和httpclient呼叫微信公众平台API

    吐槽:微信api很无语.有一部分xml.有一部分json. 最近看如何调用微信公众平台json有关api更方便.终于找到了httpcliect和gson对. 假设你有一个更好的办法,请告诉我. 了解如 ...

  2. mysql编码的那点事

    Mysql编码问题  在php页面可以向mysql插入英文字符,但就是不能插入中文字符,在cmd客户端也可从插入,这是困扰我两天的问题. 在网上找了很多资料,最终确定了是字符编码这个地方出现了问题,首 ...

  3. 关于安装Redmine服务启动和邮件设置

    关于安装Redmine服务启动和邮件设置 分类: Redmine2009-06-01 10:37 5658人阅读 评论(0) 收藏 举报 authentication邮件服务器serviceexcha ...

  4. C# socket通信随记回顾

    ----tcp(传输 控制 协议)是可靠消息:三次握手(发给对方,对方发给自己,证明对方接到消息,在发给对方,说明自己能接到对方消息,这样就都知道了):tcp:每发送一次消息,对方都会回复,证明接受到 ...

  5. 基于Web的IIS管理工具

    Servant:基于Web的IIS管理工具   Servant for IIS是个管理IIS的简单.自动化的Web管理工具.安装Servant的过程很简单,只要双击批处理文件Install Serva ...

  6. JQuery UI Layout Plug-in布局

    端]使用JQuery UI Layout Plug-in布局   引言 使用JQuery UI Layout Plug-in布局框架实现快速布局,用起来还是挺方便的,稍微研究了一下,就能上手,关于该布 ...

  7. 监控系统Opserver

    监控系统Opserver的配置调试   Stack Exchange开源其监控系统Opserver有一段时间了.之前在项目中用过他们的MiniProfile来分析页面执行效率和帮助新人了解项目,当他们 ...

  8. C#使用文件监控对象FileSystemWatcher 实现数据同步

    在C#使用文件监控对象FileSystemWatcher 实现数据同步 2013-12-12 18:24 by 幕三少, 352 阅读, 3 评论, 收藏, 编辑 最近在项目中有这么个需求,就是得去实 ...

  9. go语言defer使用

    defer Go语言中有种不错的设计,即延迟(defer)语句,你可以在函数中添加多个defer语句.当函数执行到最后时,这些defer语句会按照逆序执行,最后该函数返回.特别是当你在进行一些打开资源 ...

  10. github 出现 Permission denied (publickey)的解决

    从github上clone的时候出现了以下错误 应该是ssh key过期了,试着重新创建ssh key,按以下步骤 1.  注意短横线前后都没有空格 接着一切都默认,它会在把ssh key 储存在 C ...