首页 > UVA 216 Getting in Line

UVA 216 Getting in Line

 

大意:给你一些定点,让你以代价最小的边将所有的点连起来。

 

思路:数据范围很小,可以通过最小生成树或者回溯来解决。

 

最小生成树去写时不知道哪错了,于是用回溯模拟了一遍,相当于模拟一个数组的全排列。

 

AC CODE:

 

#include 

#include 

#include 

#include 

#include      //INT_MAX,整形范围内的最大整数。

#include 

using namespace std;



#define INF 0x3f3f3f3f

const int SIZE = 110;



double d[SIZE];

int vis[SIZE], save[SIZE], ans[SIZE];

int n;

double Min;



struct node

{

    double x, y;

}a[SIZE];



double fun(const node a, const node b)

{

    return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));

}



void init()

{

    memset(vis, 0sizeof(vis));

    for(int i = 0; i < n; i++) ans[i] = i;

    Min = INF;

}



void dfs(int cur, double sum)

{

    if(cur == n)

    {

        if(Min > sum)

        {

            Min = sum;

            memcpy(ans, save, sizeof(save));

        }

        return ;

    }

    if(sum >= Min) return ;

    for(int i = 0; i < n; i++) if(!vis[i])

    {

        vis[i] = 1;

        save[cur] = i;

        if(cur == 0)

        {

            dfs(cur+10);

        }

        else

        {

            double dis = fun(a[save[cur]], a[save[cur-1]]);

            dfs(cur+1, sum+dis);

        }

        vis[i] = 0;

    }

}



int main()

{

    int times = 0;

    while(~scanf("%d", &n) && n)

    {

        init();

        for(int i = 0; i < n; i++)

        {

            scanf("%lf%lf", &a[i].x, &a[i].y);

        }

        dfs(00);

        printf("********************************************************** ");

        printf("Network #%d ", ++times);

        for(int i = 1; i < n; i++)

        {

            double dis = fun(a[ans[i]], a[ans[i-1]]) + 16.00;

            printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet. ", a[ans[i-1]].x, a[ans[i-1]].y, a[ans[i]].x, a[ans[i]].y, dis);

        }

        double tot = (n-1)*16.00;

        printf("Number of feet of cable required is %.2lf. ", Min+tot);

    }

}

 

WA CODE:

 

#include 

#include 

#include 

#include 

#include      //INT_MAX,整形范围内的最大整数。

#include 

using namespace std;



#define INF 0x3f3f3f3f

const int SIZE = 110;





double w[SIZE][SIZE];

double d[SIZE];

int v[SIZE];

int n;



struct node

{

    double x, y;

}a[SIZE];



double fun(const node a, const node b)

{

    return sqrt((b.x - a.x) * (b.x - a.x) + (b.y - a.y) * (b.y - a.y));

}



double Prim(int src)

{

    int i, j, first = 0;

    double cnt = 0;

    int pre = src;

    for(i = 1; i <= n; i++) d[i] = (i == src)? 0:INF;

    for(i = 1; i <= n; i++)

    {

        int x;

        double m = INF;

        for(int y = 1; y <= n; y++) if(!v[y] && m > d[y]) m = d[x=y];

        v[x] = 1;

        cnt += m;

        if(first)

        {

            printf("Cable requirement to connect (%.lf,%.lf) to (%.lf,%.lf) is %.2lf feet. ", a[pre].x, a[pre].y, a[x].x, a[x].y, m+16);

        }

        for(int y = 1; y <= n; y++) d[y] = min(d[y], w[x][y]);

        pre = x;

        first = 1;

    }

    return cnt;

}



void init()

{

    memset(v, 0sizeof(v));

    memset(d, 0sizeof(d));

    memset(a, 0sizeof(a));

    for(int i = 1; i <= SIZE; i++)

        for(int j = 1; j <= SIZE; j++)

            w[i][j] = w[j][i] = INF;

}







int main()

{

    int i, j;

    int times = 0;

    while(~scanf("%d", &n) && n)

    {

        init();

        for(i = 1; i <= n; i++)

        {

            scanf("%lf%lf", &a[i].x, &a[i].y);

        }

        for(i = 1; i <= n; i++)

        {

            for(j = 1; j <= n; j++)

            {

                if(i == j) continue;

                w[i][j] = w[j][i] = fun(a[i], a[j]);

            }

        }

        printf("********************************************************** ");

        printf("Network #%d ", ++times);

        double ans = Prim(1);

        double tot = (n-1)*16.00;

        printf("Number of feet of cable required is %.2lf. ", ans+tot);

    }

    return 0;

}

 

转载于:https://www.cnblogs.com/g0feng/archive/2012/10/13/2722749.html

更多相关:

  •         Apache POI是一个开源的利用Java读写Excel,WORD等微软OLE2组件文档的项目。        我的需求是对Excel的数据进行导入或将数据以Excel的形式导出。先上简单的测试代码:package com.xing.studyTest.poi;import java.io.FileInputSt...

  • 要取得[a,b)的随机整数,使用(rand() % (b-a))+ a; 要取得[a,b]的随机整数,使用(rand() % (b-a+1))+ a; 要取得(a,b]的随机整数,使用(rand() % (b-a))+ a + 1; 通用公式:a + rand() % n;其中的a是起始值,n是整数的范围。 要取得a到b之间的...

  • 利用本征图像分解(Intrinsic Image Decomposition)算法,将图像分解为shading(illumination) image 和 reflectance(albedo) image,计算图像的reflectance image。 Reflectance Image 是指在变化的光照条件下能够维持不变的图像部分...

  • 题目:面试题39. 数组中出现次数超过一半的数字 数组中有一个数字出现的次数超过数组长度的一半,请找出这个数字。 你可以假设数组是非空的,并且给定的数组总是存在多数元素。 示例 1: 输入: [1, 2, 3, 2, 2, 2, 5, 4, 2] 输出: 2 限制: 1 <= 数组长度 <= 50000 解题: cl...

  • 题目:二叉搜索树的后序遍历序列 输入一个整数数组,判断该数组是不是某二叉搜索树的后序遍历结果。如果是则返回 true,否则返回 false。假设输入的数组的任意两个数字都互不相同。 参考以下这颗二叉搜索树:      5     /    2   6   /  1   3示例 1: 输入: [1,6,3,2,5] 输出...

  • Qt默认的QSlider和QSpinbox只能实现整数调整,不能实现浮点的变化,因此设计了如下可实现浮点变化的QFloatSlider和QFloatSpinner: QFloatSlider.h class QFloatSlider : public QSlider {Q_OBJECTpublic:QFloatSlider(QWi...

  • 一、概述 之前的文章介绍过卡尔曼滤波算法进行定位,我们知道kalman算法适合用于线性的高斯分布的状态环境中,我们也介绍了EKF,来解决在非高斯和非线性环境下的机器人定位算法。但是他们在现实应用中存在计算量,内存消耗上不是很高效。这就引出了MCL算法。 粒子滤波很粗浅的说就是一开始在地图空间很均匀的撒一把粒子,然后通过获取机器人的...

  • 1.精度问题 由于是double类型,r=mid 而不是r=mid-12.如果首位两端(f(0)和f(100))同号,证明解不在[1,100]区间内 这是我之所以TE的原因,没有预先判断3.若在这个区间内,则一定可要求出解 所以binarysearch 返回m#include #include ...

  • 代理(Proxy)模式给某一个对象提供一个代理,并由代理对象控制对原对象的引用。 代理模式的英文叫做Proxy或Surrogate,中文都可译成"代理"。所谓代理,就是一个人或者一个机构代表另一个人或者另一个机构采取行动。在一些情况下,一个客户不想或者不能够直接引用一个对象,而代理对象可以在客户端和目标对象之间起到中介的作用。 类图:...

  • 题目链接:http://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&category=41&page=show_problem&problem=1121 题意:给出两点坐标,用一条最短的线(曲线或者直线)连接起来,坐标系中原点处有一个半径为R的圆,连线不能...

  • 1. 定义网络的基本参数 定义输入网络的是什么: input = Input(shape=(240, 640, 3)) 反向传播时梯度下降算法 SGD一定会收敛,但是速度慢 Adam速度快但是可能不收敛 [link](https://blog.csdn.net/wydbyxr/article/details/84822806...

  • size_t和int       size_t是一些C/C++标准在stddef.h中定义的。这个类型足以用来表示对象的大小。size_t的真实类型与操作系统有关。 在32位架构中被普遍定义为: typedef   unsigned int size_t; 而在64位架构中被定义为: typedef  unsigned lo...

  • 我在 https://blog.csdn.net/wowricky/article/details/83218126 介绍了一种内存池,它的实现类似于linux 中打开slub_debug (1. make menuconfig: Kenel hacking -> Memory Debugging, 2. comand line中传入...

  • 项目开发中需要从引擎 获取一定范围的数据大小,用作打点上报,测试过程中竟然发现写入了一部分数据之后通过GetApproximateSizes 获取写入的key的范围时取出来的数据大小竟然为0。。。难道发现了一个bug?(欣喜) 因为写入的数据是小于一个sst的data-block(默认是4K),会不会因为GetApproximate...