UVA 216 Getting in Line

最优电缆布线策略
本文介绍了一种通过遍历所有可能的计算机排列方式来找出连接这些计算机所需的最短电缆长度的方法。该方法适用于由2到8台计算机组成的线性网络,并详细展示了如何计算任意两台相邻计算机之间的电缆长度。
部署运行你感兴趣的模型镜像

分析

一题普通的题目。需要你选择最短的一条路连接多台计算机。
问题在于选哪两台连接?暴力求解。假设把计算机标号,求其全排列。
对于每一个排列,两两求路径,累加求总长,如果累加过程中已经大于等于最小值,可以直接返回,无需再计算(不过这么做好像并没有什么卵用..)。如果小于,则更新要输出的答案,简单粗暴

思路

对于{0,1,2,...,n1}如何全排列?

int perm[MAX_N], N;
bool used[MAX_N];
void dfs(int cur)
{
    if (cur == N) {
        /*for(int i = 0; i < N; i++) printf("%d ", perm[i]); printf("\n");*/
        return;
    } else for (int i = 0; i < N; i++)
        if (!used[i]) { perm[cur] = i; used[i] = true; dfs(cur+1); used[i] = false; }
}

代码

#include <cstdio>
#include <cmath>
#define MAX_N 10
#define INF 100000000

int G[MAX_N][2], N;
struct p { int fx, fy, sx, sy; double feet; } R[MAX_N];
int perm[MAX_N];
bool used[MAX_N];
double feet[MAX_N], min;

void dfs(int cur)
{
    if (cur == N) {
        double sum = 0;
        for (int i = 1; i < N; i++) {
            feet[i] = sqrt((G[perm[i]][0]-G[perm[i-1]][0])*(G[perm[i]][0]-G[perm[i-1]][0])
                    + (G[perm[i]][1]-G[perm[i-1]][1])*(G[perm[i]][1]-G[perm[i-1]][1]))+ 16.00;
            sum += feet[i];
            if (sum >= min) return;
        }
        min = sum;
        for (int i = 0; i < N-1; i++) {
            R[i].fx = G[perm[i]][0];   R[i].fy = G[perm[i]][1]; R[i].sx = G[perm[i+1]][0];
            R[i].sy = G[perm[i+1]][1]; R[i].feet = feet[i+1];
        }
    } else for (int i = 0; i < N; i++)
        if (!used[i]) { perm[cur] = i; used[i] = true; dfs(cur+1); used[i] = false; }
}

void solve()
{
    min = INF;
    dfs(0);
    for (int i = 0; i < N-1; i++)
        printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2f feet.\n",
            R[i].fx, R[i].fy, R[i].sx, R[i].sy, R[i].feet);
    printf("Number of feet of cable required is %.2f.\n", min);
}

int main()
{
    int T = 0;
    while (scanf("%d", &N), N) {
        for (int i = 0; i < N; i++) scanf("%d%d", &G[i][0], &G[i][1]);
        printf("**********************************************************\n");
        printf("Network #%d\n", ++T);
        solve();
    }
    return 0;
}

题目

Description

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.

您可能感兴趣的与本文相关的镜像

HunyuanVideo-Foley

HunyuanVideo-Foley

语音合成

HunyuanVideo-Foley是由腾讯混元2025年8月28日宣布开源端到端视频音效生成模型,用户只需输入视频和文字,就能为视频匹配电影级音效

无界云图(开源在线图片编辑器源码)是由四川爱趣五科技推出的一款类似可画、创客贴、图怪兽的在线图片编辑器。该项目采用了React Hooks、Typescript、Vite、Leaferjs等主流技术进行开发,旨在提供一个开箱即用的图片编辑解决方案。项目采用 MIT 协议,可免费商用。 无界云图提供了一系列强大的图片编辑功能,包括但不限于: 素材管理:支持用户上传、删除和批量管理素材。 操作便捷:提供右键菜单,支持撤销、重做、导出图层、删除、复制、剪切、锁定、上移一层、下移一层、置顶、置底等操作。 保存机制:支持定时保存,确保用户的工作不会丢失。 主题切换:提供黑白主题切换功能,满足不同用户的视觉偏好。 多语言支持:支持多种语言,方便全球用户使用。 快捷键操作:支持快捷键操作,提高工作效率。 产品特色 开箱即用:无界云图采用了先进的前端技术,用户无需进行复杂的配置即可直接使用。 免费商用:项目采用MIT协议,用户可以免费使用和商用,降低了使用成本。 技术文档齐全:提供了详细的技术文档,包括技术文档、插件开发文档和SDK使用文档,方便开发者进行二次开发和集成。 社区支持:提供了微信技术交流群,用户可以在群里进行技术交流和问题讨论。 环境要求 Node.js:需要安装Node.js环境,用于运行和打包项目。 Yarn:建议使用Yarn作为包管理工具,用于安装项目依赖。 安装使用 // 安装依赖 yarn install // 启动项目 yarn dev // 打包项目 yarn build 总结 无界云图是一款功能强大且易于使用的开源在线图片编辑器。它不仅提供了丰富的图片编辑功能,还支持免费商用,极大地降低了用户的使用成本。同时,详细的文档和活跃的社区支持也为开发者提供了便利的二次开发和集成条件。无论是个人用户还是企业用户,都可以通过无界云图轻
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值