uva 216 - Getting in Line

简介: 点击打开链接 题目意思:给定n个点,求出点之间的最小的距离之和 解题思路:1 利用单源最短路算法  2 枚举点构成序列的全排列,求出所有排列的中的最小,并且记录下对应点的位置 代码: //要求单源最短路径,对于这一题我们知...

点击打开链接


题目意思:给定n个点,求出点之间的最小的距离之和


解题思路:1 利用单源最短路算法  2 枚举点构成序列的全排列,求出所有排列的中的最小,并且记录下对应点的位置


代码:

//要求单源最短路径,对于这一题我们知道点的个数最多为8,那么我们可以采用枚举每个点的顺序位置,就是去枚举这个点全排列,然后得到最小值,并且保存下序列的位置
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <list>
#include <vector>
#include <stack>
#include <cmath>
#include <algorithm>
#define eps 1e-8
using namespace std;
const int MAXN = 10010;

struct Point {
    int x;
    int y;
};
Point p[8];//存储点的坐标
int tempsum[50000][8];//保存每一个序列的点的位置
int n, k, mark;
double sum;
int vis[8];//我们初始化为0-7然后用这个数组的排列来映射点的位置

//输出函数

void output() {
    int i;
    int j = mark;
    double tsum;
    for (i = 0; i < n - 1; i++) {
        int ti = tempsum[j][i];
        int tj = tempsum[j][i + 1];
        tsum = 0.0;
        double tx = (p[ti].x - p[tj].x)*(p[ti].x - p[tj].x);
        double ty = (p[ti].y - p[tj].y)*(p[ti].y - p[tj].y);     
        tsum = (sqrt(tx + ty) + 16);
        printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n", p[ti].x, p[ti].y, p[tj].x, p[tj].y, tsum);
    }
    printf("Number of feet of cable required is %.2lf.\n", sum);
}

//处理函数

void solve() {
    sum = 999999999;
    k = 0;
    while (next_permutation(vis, vis + n)) {//全排列
        double tempSum = 0.0;
        for (int i = 0; i < n; i++)
            tempsum[k][i] = vis[i];//把vis的数组值保存到对应的排列里面
        for (int i = 0; i < n - 1; i++) {
            double tempx = (p[vis[i]].x - p[vis[i + 1]].x) * (p[vis[i]].x - p[vis[i + 1]].x);
            double tempy = (p[vis[i]].y - p[vis[i + 1]].y) * (p[vis[i]].y - p[vis[i + 1]].y);
            tempSum += (sqrt(tempx + tempy) + 16);
        }
        if (sum > tempSum) {//更新最小的sum,并且记录最小的排列的序号
            sum = tempSum;
            mark = k;
        }
        ++k;
    }
}

int main() {
    int cnt = 1;
    while (scanf("%d%*c", &n) && n) {
        for (int i = 0; i < n; i++) {
            scanf("%d%d", &p[i].x, &p[i].y);
            vis[i] = i;
        }
        solve();
        printf("**********************************************************\n");
        printf("Network #%d\n", cnt);
        output();
        ++cnt;
    }
    return 0;
}



目录
相关文章
|
算法
最小生成树【完结】
第一题 hdu 1232 畅通工程 点击打开hdu 1232 思路:模板题 点击查看代码 第二题 hdu 1233 还是畅通工程 点击打开hdu 1233 思路:模板题 点击查看代码 第三题 uva 10034 Fre...
1142 0
uva 10273 Eat or Not to Eat?
点击打开链接uva 10273 思路: 暴力求解 分析: 1 题目要求没有吃掉的奶牛的个数已经最后一次吃掉奶牛的天数 2 没有其它的方法只能暴力,对于n头牛的n个周期求最小公倍数,然后在2个公倍数之内暴力求解 代码: #inclu...
901 0
|
22小时前
|
云安全 人工智能 安全
AI被攻击怎么办?
阿里云提供 AI 全栈安全能力,其中对网络攻击的主动识别、智能阻断与快速响应构成其核心防线,依托原生安全防护为客户筑牢免疫屏障。
|
10天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
4天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
429 191
|
3天前
|
数据采集 消息中间件 人工智能
跨系统数据搬运的全方位解析,包括定义、痛点、技术、方法及智能体解决方案
跨系统数据搬运打通企业数据孤岛,实现CRM、ERP等系统高效互通。伴随数字化转型,全球市场规模超150亿美元,中国年增速达30%。本文详解其定义、痛点、技术原理、主流方法及智能体新范式,结合实在Agent等案例,揭示从数据割裂到智能流通的实践路径,助力企业降本增效,释放数据价值。