【BZOJ3291】Alice与能源计划

Description

在梦境中,Alice来到了火星。不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验。

为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系。
火星上一共有N个居民点。每个居民点认为是平面上的一个点。第i个居民点的坐标为(Xi, Yi),对能源的需求量为Poweri。每个居民点消耗的能源由它附近的发电站提供。由于技术原因,一个居民点消耗的所有能源必须来自同一座发电站。
自人类移民火星之初,政府就有一个规模宏大的发电站建设计划。
按照这个计划,政府将在火星上建立M座发电站,这M座发电站将是火星居民的全部能量来源。其中,第i座发电站的坐标为(xi, yi),产生能量的上限值为Limiti,建设费用为Pricei。同样由于技术原因,第i座发电站只能为与它的距离不超过Ri的居民点提供能源。
然而,由于政府的财政状况一直十分紧张,截至目前,这M座发电站中只有少量建成并投入使用,多数的发电站尚未开始建设。

Alice的任务是修改这个计划,使得它更符合实际情况。根据新的规定,一座发电站产生的所有能源必须提供给同一个居民点。Alice知道这个规定意味着N个居民点消耗的能源将分别由N座不同的发电站提供,而且为第i个居民点提供能源的那座发电站的Limit值一定不小于Poweri。

Alice需要在原计划的M座发电站中选择恰好N座发电站,并完全放弃剩余的M - N座发电站,使得这N座发电站能够满足N个居民点的需要。
对于一个可行的方案,设方案中选择的N座发电站构成集合S,而已经建成的发电站构成集合T,那么定义这个方案的代价为

即,一个方案的代价等于被选择的且尚未建成的发电站的建设费用之和加上没有被选择的且已经建成的发电站的建设费用之和。

在所有可行方案中,你必须帮助Alice找到代价最小的方案,并将选择的N座发电站按编号从小到大的顺序输出。
如果代价最小的方案不唯一,则输出其中字典序最小的方案。

注意,输入文件包含多组测试数据。

Input

 第一行包含一个正整数T,表示有T组测试数据。接下来依次是T组测试数据。
  每组测试数据的第一行包含两个整数N、M。
  接下来N行,每行3个整数:Xi、Yi、Poweri
  再接下来M行,每行6个整数:xi、 yi、Limiti、Pricei、Ri、Finishedi。若Finished= 1,表示第i座发电站已经建成;否则Finishedi = 0,表示第i座发电站尚未开始建设。

Output

  对于每组测试数据:
  若存在可行方案则输出两行。第一行为一个整数,表示最小代价;第二行是若干个递增的整数,表示字典序最小的最优方案选择的发电站的编号。
  若不存在可行方案,则仅输出一行为一个整数-1。

Sample Input

4
1 1
4 4 1
8 7 1 2 5 1
2 3
0 0 3
2 0 2
1 1 5 1 3 0
1 0 5 1 1 1
3 0 5 1 3 0
2 3
0 0 3
2 0 2
1 1 2 0 3 0
1 0 1 0 1 1
3 0 3 0 2 0
2 3
0 0 3
2 0 2
1 1 4 2 2 0
1 0 2 9 1 1
3 0 5 4 2 1

Sample Output

0
1
1
1 2
-1
6
1 2
样例说明
  第1组测试数据:
  只有一个居民点,其坐标为(4, 4),能源需求量Power1 = 1;仅一座发电站,其坐标为(8, 7),产生的能量上限Limit1 = 1,建设费用Price1 = 2,服务范围半径R1 = 5,Finished1 = 1表示已经建成。
  两个点之间的距离等于5不超过R1,并且Power1 ≤ Limit1。因此唯一的可行方案是花费0的代价保留1号发电站,使它为1号居民点提供能源。
  第2组测试数据:任意选择两个发电站都是一个可行方案。最小代价是1,对应的方案有两种:选择1号和2号发电站;选择2号和3号发电站。而前者的字典序更小。
  第3组测试数据:不存在可行方案。
  第4组测试数据:代价最小的方案唯一:选择1号和2号发电站,代价为6。

HINT

  对于100%的数据:1 ≤ N ≤ 400,1 ≤ M ≤ 500,1 ≤ T ≤ 10,0 ≤ xi, yi , Xi , Yi, Pricei ≤ 10 000,1 ≤ Ri, Poweri, Limiti ≤ 10 000。不同的居民点或发电站的坐标有可能重合。

附注
  关于方案的字典序的大小关系的说明:
  设方案A选择的N座发电站的编号从小到大依次为A1, A2, …, AN;设方案B选择的N座发电站的编号从小到大依次为B1, B2, …, BN。
  我们称方案A比方案B字典序更小,当且仅当存在正整数i,满足1≤i≤N,使得对任意1≤k≤i-1有Ak = Bk,且Ai < Bi。

题解:看到题目和数据范围直接想到费用流,然后光荣TLE了,看题解发现是匈牙利~

首先,不选建成的发电站和选未建成的发电站都要付出代价,我们希望将代价都转换成:选择该发电站的代价。所以自然想到先假设所有简称的发电站都不选,然后选了它就会付出-Price的代价。然后本题就变成了一个二分图的带权匹配。

但是本题还有一个特殊的性质,就是一个发电站的所有出边的边权都是相等的。那么我们可以模拟费用流的方法,每次贪心的选取代价最小的发电站,如果代价相同则选取编号最小的。具体实现就是先排序,然后跑匈牙利即可。

rank2,感觉还不错~

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m,cnt,sum,ans;
int head[510],vis[510],from[510],to[200010],next[200010];
int X[510],Y[510],P[510];
struct tower
{
int x,y,p,r,cost,org;
}s[510];
int rd()
{
int ret=0; char gc=getchar();
while(gc<'0'||gc>'9') gc=getchar();
while(gc>='0'&&gc<='9') ret=ret*10+gc-'0',gc=getchar();
return ret;
}
void add(int a,int b)
{
to[cnt]=b,next[cnt]=head[a],head[a]=cnt++;
}
bool cmp(tower a,tower b)
{
return (a.cost==b.cost)?(a.org<b.org):(a.cost<b.cost);
}
int dfs(int x)
{
for(int i=head[x];i!=-1;i=next[i])
{
if(!vis[to[i]])
{
vis[to[i]]=1;
if(!from[to[i]]||dfs(from[to[i]]))
{
from[to[i]]=x;
return 1;
}
}
}
return 0;
}
void work()
{
memset(head,-1,sizeof(head));
memset(from,0,sizeof(from));
sum=ans=cnt=0;
n=rd(),m=rd();
int i,j,flag=0;
for(i=1;i<=n;i++) X[i]=rd(),Y[i]=rd(),P[i]=rd();
for(i=1;i<=m;i++)
{
s[i].x=rd(),s[i].y=rd(),s[i].p=rd(),s[i].cost=rd(),s[i].r=rd();
if(rd()) ans+=s[i].cost,s[i].cost=-s[i].cost;
s[i].org=i;
}
sort(s+1,s+m+1,cmp);
for(i=1;i<=m;i++) for(j=1;j<=n;j++)
if(s[i].p>=P[j]&&(s[i].x-X[j])*(s[i].x-X[j])+(s[i].y-Y[j])*(s[i].y-Y[j])<=s[i].r*s[i].r)
add(i,j);
for(i=1;i<=m&&sum<n;i++)
{
memset(vis,0,sizeof(vis));
sum+=dfs(i);
}
if(sum<n)
{
printf("-1\n");
return ;
}
memset(vis,0,sizeof(vis));
for(i=1;i<=n;i++) vis[s[from[i]].org]=1,ans+=s[from[i]].cost;
printf("%d\n",ans);
for(i=1;i<=m;i++)
{
if(vis[i])
{
if(flag) printf(" ");
flag=1,printf("%d",i);
}
}
printf("\n");
}
int main()
{
int T=rd();
while(T--) work();
return 0;
}

【BZOJ3291】Alice与能源计划 二分图最大匹配的更多相关文章

  1. [bzoj3291] Alice与能源计划 (二分图最大匹配)

    传送门 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系. ...

  2. 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  3. BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流

    题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...

  4. POJ 2226二分图最大匹配

    匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...

  5. POJ2239 Selecting Courses(二分图最大匹配)

    题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...

  6. poj 2239 二分图最大匹配,基础题

    1.poj 2239   Selecting Courses   二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...

  7. UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法

    二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...

  8. 二分图最大匹配的K&#246;nig定理及其证明

     二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有.    以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...

  9. POJ3057 Evacuation(二分图最大匹配)

    人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...

随机推荐

  1. 如何将Windows8系统的磁盘格式(GPT格式)转换成Windows 7系统的磁盘格式(MBR格式)

    知识点分析:随机预装Win8的电脑,磁盘为GPT格式的,如果需要安装Win7等早期版本系统,需要转换为MBR格式的,使用Diskpart命令即可完成转换.操作步骤: 注意:转换磁盘格式需要清空磁盘中的 ...

  2. Java IO 学习(三)缓冲IO / 直接IO / 内存映射

    缓冲IO 在介绍缓冲IO之前需要先了解一下常用的机械硬盘的原理与特点 一个机械硬盘中装有多个盘片 每个盘片上有多个同心圆(磁道) 每个同心圆又由多个弧(扇区)组成,每个弧上都记录了等量的数据(比方说5 ...

  3. 强连通分量(Tarjan)模板

    贴模板,备忘. 模板1: #include<iostream> #include<cstring> #include<cmath> #include<cstd ...

  4. bzoj 5125: [Lydsy1712月赛]小Q的书架

    新学了一波 决策单调性 dp 套路.... 这种dp一般是长这样的 => f[i][j] = max/min  { f[i-1][k] + cost(k+1,j)} ,其中cost函数满足四边形 ...

  5. Spring MVC 学习

    一.基础 Spring MVC是当前最优秀的MVC框架,自从Spring 2.5版本发布后,由于支持注解配置,易用性有了大幅度的提高.Spring 3.0更加完善,实现了对Struts 2的超越.现在 ...

  6. ios6.0 siri语音识别

    Siri 让你能够利用语音来完成发送信息.安排会议.拨打电话等更多事务* .只需像平常一样讲话,就能让 Siri 帮你做事.你会发现 Siri 是如此易用而且能干,精彩用法越用你会发现越多. 懂你所说 ...

  7. 通达OA 小飞鱼工作流在线培训教程(七)工作流应用的意义及基础设置(图文)

    这个课程计划已经有一段时间了,经过这段时间结合实际网络教学又进行了一些总结,这里将陆续为大家呈现相关的工作流设计开发课程. 同一时候线上的视频教学课程也将立即上线,欢迎朋友们的关注. 首先介绍一些工作 ...

  8. 【前端阅读】——《编程之魂》摘记&读后感&思维导图

    前言:这本书全名叫<编程之魂——与27为编程语言创始人对话>,它的内容以采访对话为主,以图通过和顶级大师的真实交流来调查:大师们为什么要创建某种编程语言,它的技术如何开发.如何教授和学习, ...

  9. 分布式数据库中间件–(1) Cobar初始化过程

    Cobar-Server的源代码地址:GitHub 欢迎Fork. 官方文档描写叙述Cobar的网络通信模块见下图. Cobar使用了Java的NIO进行处理读写.NIO是Java中的IO复用.而不须 ...

  10. 以前整理的网络上免费API接口

    以前整理的一些免费的API接口,具体是否好用还需要时间测试,但是先分享给大家. 天气接口 聚合数据: http://op.juhe.cn/onebox/weather/query 用例 官方文档 来源 ...