题目描述

在梦境中,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座发电站按编号从小到大的顺序输出。如果代价最小的方案不唯一,则输出其中字典序最小
的方案。
注意,输入文件包含多组测试数据。

输入

第一行包含一个正整数T,表示有T组测试数据。接下来依次是T组测试数据。
每组测试数据的第一行包含两个整数N、M。
接下来N行,每行3个整数:Xi、Yi、Poweri。
再接下来M行,每行6个整数:xi、yi、Limiti、Pricei、Ri、Finishedi。
若Finishedi=1,表示第i座发电站已经建成;否则Finishedi=0,表示第i座发电站尚未开始建设。
1≤N≤400,1≤M≤500,1≤T≤10,0≤xi,yi,Xi,Yi,Pricei≤10000,
1≤Ri,Poweri,Limiti≤10000。不同的居民点或发电站的坐标有可能重合。
关于方案的字典序的大小关系的说明:
设方案A选择的N座发电站的编号从小到大依次为A1,A2,…,AN;
设方案B选择的N座发电站的编号从小到大依次为B1,B2,…,BN。
我们称方案A比方案B字典序更小,当且仅当存在正整数i,满足1≤i≤N,
使得对任意1≤k≤i-1有Ak=Bk,且Ai<Bi。

输出

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

样例输入

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

样例输出

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。
 
对于已建成的发电站和未建成的发电站代价计算不同,我们需要先将计算方法统一。可以将已建成的发电站代价先计入答案当中,然后将发电站代价取相反数当作未建成的发电站处理。这样就能得到一种费用流的方法:$O(nm)$处理出每个发电站能为哪些居民点供电并连边,容量为$1$,费用为$0$;源点向发电站连边,容量为$1$,费用为对应代价;居民点向汇点连边,容量为$1$,费用为$0$。但这样直接跑费用流显然会$TLE$,我们观察这个图的性质:这是个二分图且只有源点向发电站的边有费用。因为每次费用流增广时一定是增广一条费用最小的路径,所以直接按照发电站的代价从小到大排序并按顺序做二分图最大匹配即可。

#include<set>
#include<map>
#include<queue>
#include<stack>
#include<cmath>
#include<cstdio>
#include<vector>
#include<bitset>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
int head[510];
int to[200010];
int next[200010];
int from[410];
int vis[410];
int ans;
int n,m,T;
int x[410];
int y[410];
int opt;
int tot;
int v[410];
int a[410];
int now;
struct miku
{
int x,y,l,r,p,id;
}s[510];
void add(int x,int y)
{
next[++tot]=head[x];
head[x]=tot;
to[tot]=y;
}
bool cmp(miku a,miku b)
{
return a.p==b.p?a.id<b.id:a.p<b.p;
}
bool dfs(int x)
{
for(int i=head[x];i;i=next[i])
{
if(vis[to[i]]!=now)
{
vis[to[i]]=now;
if(!from[to[i]]||dfs(from[to[i]]))
{
from[to[i]]=x;
return true;
}
}
}
return false;
}
int main()
{
scanf("%d",&T);
while(T--)
{
scanf("%d%d",&n,&m);
ans=0,tot=0;
memset(head,0,sizeof(head));
memset(from,0,sizeof(from));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
{
scanf("%d%d%d",&x[i],&y[i],&v[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d%d%d%d%d",&s[i].x,&s[i].y,&s[i].l,&s[i].p,&s[i].r,&opt);
s[i].id=i;
if(opt)
{
ans+=s[i].p;
s[i].p=-s[i].p;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(v[i]<=s[j].l&&(s[j].x-x[i])*(s[j].x-x[i])+(s[j].y-y[i])*(s[j].y-y[i])<=s[j].r*s[j].r)
{
add(j,i);
}
}
}
sort(s+1,s+1+m,cmp);
int k=0;
for(int i=1;i<=m;i++)
{
now=i;
if(dfs(s[i].id))
{
ans+=s[i].p;
k++;
a[k]=s[i].id;
}
if(k==n)
{
break;
}
}
if(k==n)
{
printf("%d\n",ans);
sort(a+1,a+1+n);
for(int i=1;i<=n;i++)
{
printf("%d",a[i]);
printf(i==n?"\n":" ");
}
}
else
{
printf("-1\n");
}
}
}

BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流的更多相关文章

  1. BZOJ2557[Poi2011]Programming Contest——匈牙利算法+模拟费用流

    题目描述 Bartie and his friends compete in the Team Programming Contest. There are n contestants on each ...

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

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

  3. 【CF280D】 k-Maximum Subsequence Sum ,线段树模拟费用流

    昨天考试被教育了一波.为了学习一下\(T3\)的科技,我就找到了这个远古时期的\(cf\)题(虽然最后\(T3\)还是不会写吧\(QAQ\)) 顾名思义,这个题目其实可以建成一个费用流的模型.我们用流 ...

  4. [NOI2019]序列(模拟费用流)

    题意: 有两个长度为n的序列,要求从每个序列中选k个,并且满足至少有l个位置都被选,问总和最大是多少. \(1\leq l\leq k\leq n\leq 2*10^5\). 首先,记录当前考虑到的位 ...

  5. 贪心(模拟费用流):NOIP2011 观光公交

    [问题描述] 风景迷人的小城Y 市,拥有n 个美丽的景点.由于慕名而来的游客越来越多,Y 市特意安排了一辆观光公交车,为游客提供更便捷的交通服务.观光公交车在第0 分钟出现在1号景点,随后依次前往2. ...

  6. BZOJ4977[Lydsy1708月赛]跳伞求生——贪心+堆+模拟费用流

    题目链接: 跳伞求生 可以将题目转化成数轴上有$n$个人和$m$个房子,坐标分别为$a_{i}$和$b_{i}$,每个人可以进一个他左边的房子,每个房子只能进一个人.每个房子有一个收益$c_{i}$, ...

  7. 【bzoj1150】[CTSC2007]数据备份Backup 模拟费用流+链表+堆

    题目描述 你在一家 IT 公司为大型写字楼或办公楼(offices)的计算机数据做备份.然而数据备份的工作是枯燥乏味的,因此你想设计一个系统让不同的办公楼彼此之间互相备份,而你则坐在家中尽享计算机游戏 ...

  8. [UOJ455][UER #8]雪灾与外卖——堆+模拟费用流

    题目链接: [UOJ455]雪灾与外卖 题目描述:有$n$个送餐员(坐标为$x_{i}$)及$m$个餐厅(坐标为$y_{i}$,权值为$w_{i}$),每个送餐员需要前往一个餐厅,每个餐厅只能容纳$c ...

  9. BZOJ4849[Neerc2016]Mole Tunnels——模拟费用流+树形DP

    题目描述 鼹鼠们在底下开凿了n个洞,由n-1条隧道连接,对于任意的i>1,第i个洞都会和第i/2(取下整)个洞间有一条隧 道,第i个洞内还有ci个食物能供最多ci只鼹鼠吃.一共有m只鼹鼠,第i只 ...

随机推荐

  1. Chrome开发者工具应对页面跳转页面点击事件等实用干货

    1.如何解决页面跳转 打开Preserve log即可 禁用页面缓存在右边的disable cache 2.如何监听页面点击 重要的是举一反三,看不懂英文去翻译!Mouse鼠标,click点击,,,, ...

  2. Maven报错Archive for required library:某.jar' in project '项目名'

    Maven报错Archive for required library:某.jar' in project '项目名'cannot be read or is not a valid ZIP file ...

  3. mybatis 多个接口参数的注解使用方式(@Param)

    目录 1 简介 1.1 单参数 1.2 多参数 2 多个接口参数的两种使用方式 2.1 Map 方法(不推荐) 2.1.1 创建接口方法 2.1.2 配置对应的SQL 2.1.3 调用 2.2 @Pa ...

  4. 持续集成之单元测试篇——WWH(讲讲我们做单元测试的故事)

    持续集成之单元测试篇--WWH(讲讲我们做单元测试的故事) 前言 临近上线的几天内非重大bug不敢进行发版修复,担心引起其它问题(摁下葫芦浮起瓢) 尽管我们如此小心,仍不能避免修改一些bug而引起更多 ...

  5. bootstrapValidator表单验证插件

    bootstrapValidator——一个很好用的表单验证插件,再也不用手写验证规则啦! bootstrapValidator官方文档:http://bootstrapvalidator.votin ...

  6. 升级NGINX支持HTTP/2服务端推送

    内容概览 NGINX从1.13.9版本开始支持HTTP/2服务端推送,上周找时间升级了下NGINX,在博客上试验新的特性. 升级工作主要包括: 升级NGINX 修改NGINX配置 修改wordpres ...

  7. Python-正则表达式总结版

    前言: 总是写不好正则表达式,时间长不用就有些忘记了,故此在总结一篇文章以便日后查阅. 一.常用的匹配规则总结表 模式 描述 \w 匹配字母数字及下划线 \W 匹配非字母数字及下划线 \s 匹配任意空 ...

  8. debian6保存iptables规则

    iptables规则不保存,一旦机器重启规则就清空了,所以需要保存: iptables-save >/etc/iptables-script vi /etc/rc.local 然后在文件中输入: ...

  9. semantic-ui 分割线

    分割线即原生html中的<hr>标签.不过semantic-ui中将<hr>美化了一下下. 1.基础分割线 需要注意的是分割线只能使用div标签和p标签,不能使用span标签. ...

  10. MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) - 转载

    MySQL基础配置之mysql的默认字符编码的设置(my.ini设置字符编码) MySQL的默认编码是Latin1,不支持中文,那么如何修改MySQL的默认编码呢,下面以设置UTF-8为例来说明. 需 ...