UVa 216 网络连线

题意:给出一些电脑的二维坐标,连接两个电脑所用网线长为它们之间的直线距离再加上16 feet。要求把所有电脑连成一个串,怎样连,使得所用网线最短,并且按从一端到另一端的顺序输出连接的两个电脑间的距离。

思路:很容易想到的就是暴力枚举,将所有电脑做一个全排列,求得总长最小值的那个。这里用的递归枚举、即回溯法,进行了剪枝优化。

第一次交WA了,重读题目、看别人题解,都没找到原因。看到别人的freopen,才发现我交的里面freopen没注释掉~

Code:

#include<stdio.h>
#include<math.h>

void solve(int n,int *A,int cur,double dist);

int comp[10][2];
int A[10];//排列
double C[10];//相邻两点间距离
int bestA[10];
double bestC[10];
double bestdist;

int main()
{
  //freopen("216.in","r",stdin);
  //freopen("216.out","w",stdout);

  int n;
  int num=1;
  while(scanf("%d",&n)==1 && n)
  {
    for(int i=0;i<n;++i)
      scanf("%d%d",&comp[i][0],&comp[i][1]);
    bestdist=1000000000;
    double dist=0;
    solve(n,A,0,dist);
    printf("**********************************************************\n");
    printf("Network #%d\n",num++);
    for(int i=0;i<n-1;++i)
      printf("Cable requirement to connect (%d,%d) to (%d,%d) is %.2lf feet.\n"
        ,comp[bestA[i]][0],comp[bestA[i]][1],comp[bestA[i+1]][0],comp[bestA[i+1]][1],bestC[i]);
    printf("Number of feet of cable required is %.2lf.\n",bestdist);
  }
  return 0;
}

void solve(int n,int *A,int cur,double dist)
{
  if(cur==n && dist<bestdist)
  {
    bestdist=dist;
    for(int i=0;i<n-1;++i)
      { bestC[i]=C[i]; bestA[i]=A[i]; }
    bestA[n-1]=A[n-1];
  }
  else
  for(int i=0;i<n;++i)
  {
    int ok=1;
    for(int j=0;j<cur;++j) if(A[j]==i) { ok=0; break; }
    if(ok)
    {
      A[cur]=i;
      if(cur)
      {
        int dx=comp[A[cur]][0]-comp[A[cur-1]][0];
        int dy=comp[A[cur]][1]-comp[A[cur-1]][1];
        double jl=16+sqrt(dx*dx+dy*dy);
        C[cur-1]=jl;
        dist=dist+jl;
        if(jl<bestdist && dist<bestdist) solve(n,A,cur+1,dist);
        dist=dist-jl;//不要忘了这里的恢复。对枚举的每个i来说,dist应该是相同的。每一次i过来时,改变了dist的值,枚举下一个i时,应该把dist恢复。
      }
      else solve(n,A,cur+1,dist);//不要忘了这个
    }
  }
}
时间: 2024-11-13 10:35:25

UVa 216 网络连线的相关文章

uva 216 Getting in Line (暴力枚举)

uva 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 t

网络多线线程下载示例

网络多线线程下载: IO流与多线程应用示例 1 import priv.gdw.utils.FileUtils; 2 import java.io.*; 3 import java.net.URL; 4 import java.net.URLConnection; 5 6 /** 7 * Created by kong on 07/11/2017. 8 */ 9 10 public class Test02 { 11 12 public static void main(String[] arg

UVa 216 - Getting in Line

题目:给你n台电脑所在的平面位置,求把他们连乘线型网络需要的最小的网线长度. 分析:搜索,枚举. 因为数据规模很小,枚举所有电脑的全排列,每一个排列对应一种连线方式. 枚举所有的连线方式,找到其中最小的,输出路径即可. 说明:开始以为是最短路或者最小生成树类似物(⊙_⊙). #include <iostream> #include <cstdlib> #include <cstdio> #include <cmath> using namespace std

UVa 11248 网络扩容(最大流(需要优化))

https://vjudge.net/problem/UVA-11248 题意: 给定一个有向网络,每条边均有一个容量.问是否存在一个从点1到点N,流量为C的流.如果不存在,是否可以恰好修改一条弧的容量,使得存在这样的流. 思路: 先求一遍最大流,如果大于等于C,那么就直接输出possible. 否则的话就是最大流达不到C,那么对哪些边进行扩容呢,肯定是选择最小割! 将最小割的边集全部求出来,之后每条边都尝试将容量变为C,看看能否达到要求. 优化一:求完最大流后把流量留着,以后每次在它的基础上增

Windows Mobile 模拟器如何设置网络连线

3. 开始—>设置—>Network Cards—>NE2000 选Work 和NE2000 设置DNS: 4. 开始—>设置—>Connections—>Connections

UVa 216 Getting in Line【枚举排列】

题意:给出n个点的坐标,(2<=n<=8),现在要使得这n个点连通,问最小的距离的和 因为n很小,所以可以直接枚举这n个数的排列,算每一个排列的距离的和, 保留下距离和最小的那个排列就可以了(这个地方和带宽那题有点像,用memcpy将整个排列保留下来) 1 #include<iostream> 2 #include<cstdio> 3 #include<cstring> 4 #include <cmath> 5 #include<stack

Centos的网络配置命令和文件

一.ifcongfig Centos6之前最常用的配置网络命令就是ifconfig,使用ifconfig命令时最好切换到root用户的身份 1.直接使用ifconfig可以查看当前配置的网络设备的信息 例如 [[email protected] ~]# ifconfig eno16777728: flags=4163<UP,BROADCAST,RUNNING,MULTICAST>  mtu 1500         inet 172.16.9.9  netmask 255.255.0.0  b

网络基础知识查询

第一章.基础网络概念 1.1 网络是个什么玩意儿 全世界的人种有很多,人类使用的语言种类也多的很.那如果你想要跟外国人沟通时,除了比手划脚之外,你要如何跟对方讲话? 大概只有两种方式啰,一种是强迫他学中文,一种则是我们学他的语言,这样才能沟通啊.在目前世界上的强势语言还是属于英语系国家, 所以啰,不管是啥人种,只要学好英文,那么大家都讲英文,彼此就能够沟通了.希望不久的未来,咱们的中文能够成为强势语言啊! 这个观念延伸到网络上面也是行的通的,全世界的操作系统多的很,不是只有 Windows/Li

linux之网络基础

转自 http://www.cnblogs.com/shijiaqi1066/p/3840284.html Linux网络接口 Linux网络接口,包含了网卡的概念. 在Linux系统中,命名规律: eth0为第一个接口(Ethernet Card),eth1为第二个. lo为本地环回接口,它的IP地址固定为127.0.0.1,掩码8位. ifconfig命令 ifconfig命令常用来显示系统中的网络接口(网卡)信息,也可以用来配置网络接口(configure a network interf