博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Uva 1151 Buy or Build 二进制枚举+最小生成树
阅读量:3904 次
发布时间:2019-05-23

本文共 1180 字,大约阅读时间需要 3 分钟。

题目描述

万维网(WWN)是一家运营大型电信网络的领先公司。 WWN希望在Borduria建立一个新的网络,您需要帮助WWN确定如何以最低的总成本设置其网络。有几个本地公司运营着一些小型网络(以下称为子网),部分覆盖了Borduria的n个最大城市。 WWN希望建立一个连接所有n个城市的网络。 要实现这一目标,它可以从头开始在城市之间建设网络,也可以从本地公司购买一个或多个子网。 您需要帮助WWN决定如何以最低的总成本建设其网络。

1、所有n个城市都给出其二维坐标

2、存在q个子网。 如果q≥1,给出每个子网中连接的城市。(不用关心连接的形状)

3、每个子网只能购买,不能被分割

4、连接两个不相通的城市,必须建立一个边,其建设成本是城市之间欧几里德距离的平方。

您的任务是决定购买哪些现有网络以及建设哪些边,使得总成本最低。

输入格式

输入文件的第一行是一个整数T,表示测试数据的组数。接下来是一个空白行。每两组测试数据之间也有一个空白行。

对于每组测试数据:

第一行是两个整数,分别是城市的总数n和子网的数量q,1≤n≤1000,0≤q≤8。城市的编号从1到n

接下来q行,每行多个整数,第一个整数表示这个子网中的城市的数量m,第二个整数表示购买这个子网的费用(费用不超过2*10^6),剩下的m个整数表示这个子网包含的城市

接下来n行,每行两个整数,表示第i个城市的坐标(坐标的数字范围是0到3000)

输出格式

对于每组测试数据输出一行,输出建设网络的总费用。每组输出之间用一个空行隔开

思路:

因为最多只有8个"套餐",所以我们用二进制枚举下每个套餐买与不买的状态,然后每一个状态跑一边最小生成树将没加入的点加入就可以了。

代码如下:

#include 
#include
#include
#include
#include
using namespace std;typedef long long ll;const int maxn=1e3+5;int t,n,q;int num[maxn];int coll[maxn][maxn];int sp[maxn];int posx[maxn],posy[maxn];int a[maxn];int ans=0x3f3f3f3f;int id;struct edge{ int u; int v; int len;};edge e[maxn*maxn];int compare (edge a,edge b){ return a.len
>i)&1; if(t==0) continue; tans+=sp[i]; for (int j=1;j

 

转载地址:http://xzoen.baihongyu.com/

你可能感兴趣的文章
Java进阶之----LinkedList源码分析
查看>>
Java设计模式--责任链模式(Chain of Responsibility)
查看>>
Java设计模式——Iterator迭代器
查看>>
Java设计模式——Comparable接口&&Comparator(CC系)策略模式的应用
查看>>
Java设计模式——Comparable接口&&Comparator(CC系)策略模式的应用[续]
查看>>
Java设计模式——代理模式
查看>>
Java设计模式——工厂模式
查看>>
Java设计模式——工厂模式——模拟Spring
查看>>
Java设计模式——桥接模式(Bridge)(容易,次要)
查看>>
Java设计模式——Command模式(容易,次要)
查看>>
Java-设计模式学习笔记-总结
查看>>
Java设计模式——观察者模式
查看>>
技术的热门度曲线
查看>>
Java数据库操作(JDBC)——eclipse连接oracle11g教程
查看>>
Java_JDBC_MySQL学习笔记
查看>>
Java数据库连接池 学习笔记
查看>>
Servlet & Jsp Web——Servlet开发(一)
查看>>
web服务器基本原理及Tomcat配置
查看>>
MyEclipse 2017配置Tomcat8
查看>>
HTTP协议简介
查看>>