[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。
若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。
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
HINT
第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。
Solution
很显然可以用费用流做虽然会T233
具体就是S向发电站连费用的边,其他正常连边,对于已经建好的可以先把花费计到答案里,然后把这个花费取负
然后发现其实只需要贪心地找花费最少的边然后跑最大匹配即可
Code
//By Menteur_Hxy
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define F(i,a,b) for(register int i=(a);i<=(b);i++)
#define E(i,u) for(register int i=head[u],v;i;i=nxt[i])
#define add(a,b) nxt[++cnt]=head[a],to[cnt]=b,head[a]=cnt
#define getchar() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin)),p1==p2?EOF:*p1++)
using namespace std;
char buf[1<<21],*p1,*p2;
int read() {
int x=0,f=1; char c=getchar();
while(!isdigit(c)) {if(c=='-')f=-f; c=getchar();}
while(isdigit(c)) x=(x<<1)+(x<<3)+c-48,c=getchar();
return x*f;
}
const int N=510;
int n,m,ans,num,cnt,now;
int nxt[N*N],to[N*N],head[N];
int cho[N],vis[N],fr[N];
struct per{int x,y,p;}P[N];
struct sta{
int x,y,l,p,r,id;
bool operator < (const sta oth)const {
if(p==oth.p) return id<oth.id;
return p<oth.p;
}
}S[N];
bool jud(int a,int b) {
if(S[a].l<P[b].p) return 0;
if((S[a].x-P[b].x)*(S[a].x-P[b].x)+(S[a].y-P[b].y)*(S[a].y-P[b].y)>S[a].r*S[a].r) return 0;
return 1;
}
bool dfs(int x) {
E(i,x) if(vis[(v=to[i])]!=now) {
vis[v]=now;
if(!fr[v]||dfs(fr[v])) {fr[v]=x; return 1;}
}
return 0;
}
int main() {
int cas=read();
while(cas--) {
n=read(),m=read(); ans=0;
F(i,1,n) {
int x=read(),y=read(),da=read();
P[i]=(per){x,y,da};
}
F(i,1,m) {
int x=read(),y=read(),l=read();
int p=read(),r=read(),f=read();
S[i]=(sta){x,y,l,p,r,i};
if(f) ans+=p,S[i].p=-p;
}
sort(S+1,S+1+m);
cnt=num=0; memset(head,0,sizeof(head));
F(i,1,m) F(j,1,n) if(jud(i,j)) add(i,j);
memset(vis,-1,sizeof(vis));
memset(fr,0,sizeof(fr));
for(now=1;now<=m&&num<=n;now++) if(dfs(now))
ans+=S[now].p,cho[++num]=S[now].id;
if(num<n) {puts("-1");continue;}
printf("%d\n",ans);
sort(cho+1,cho+1+num);
F(i,1,n) printf("%d%c",cho[i],(i==n?'\n':' '));
}
return 0;
}
[bzoj3291] Alice与能源计划 (二分图最大匹配)的更多相关文章
- 【BZOJ3291】Alice与能源计划 二分图最大匹配
[BZOJ3291]Alice与能源计划 Description 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星 ...
- 【bzoj3291】Alice与能源计划 模拟费用流+二分图最大匹配
题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验. 为了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...
- BZOJ3291Alice与能源计划——匈牙利算法+模拟费用流
题目描述 在梦境中,Alice来到了火星.不知为何,转眼间Alice被任命为火星能源部长,并立刻面临着一个严峻的考验.为 了方便,我们可以将火星抽象成平面,并建立平面直角坐标系.火星上一共有N个居民点 ...
- POJ 2226二分图最大匹配
匈牙利算法是由匈牙利数学家Edmonds于1965年提出,因而得名.匈牙利算法是基于Hall定理中充分性证明的思想,它是二部图匹配最常见的算法,该算法的核心就是寻找增广路径,它是一种用增广路径求二分图 ...
- POJ2239 Selecting Courses(二分图最大匹配)
题目链接 N节课,每节课在一个星期中的某一节,求最多能选几节课 好吧,想了半天没想出来,最后看了题解是二分图最大匹配,好弱 建图: 每节课 与 时间有一条边 #include <iostream ...
- poj 2239 二分图最大匹配,基础题
1.poj 2239 Selecting Courses 二分图最大匹配问题 2.总结:看到一个题解,直接用三维数组做的,很巧妙,很暴力.. 题意:N种课,给出时间,每种课在星期几的第几节课上 ...
- UESTC 919 SOUND OF DESTINY --二分图最大匹配+匈牙利算法
二分图最大匹配的匈牙利算法模板题. 由题目易知,需求二分图的最大匹配数,采取匈牙利算法,并采用邻接表来存储边,用邻接矩阵会超时,因为邻接表复杂度O(nm),而邻接矩阵最坏情况下复杂度可达O(n^3). ...
- 二分图最大匹配的König定理及其证明
二分图最大匹配的K?nig定理及其证明 本文将是这一系列里最短的一篇,因为我只打算把K?nig定理证了,其它的废话一概没有. 以下五个问题我可能会在以后的文章里说,如果你现在很想知道的话,网上 ...
- POJ3057 Evacuation(二分图最大匹配)
人作X部:把门按时间拆点,作Y部:如果某人能在某个时间到达某门则连边.就是个二分图最大匹配. 时间可以二分枚举,或者直接从1枚举时间然后加新边在原来的基础上进行增广. 谨记:时间是个不可忽视的维度. ...
随机推荐
- [Node.js] Add Logging to a Node.js Application using Winston
Winston is a popular logging library for NodeJS which allows you to customise the output, as well as ...
- SDUT OJ -2892 A
A nid=24#time" title="C.C++.go.haskell.lua.pascal Time Limit60ms Memory Limit 65536K java. ...
- poj 1080 Human Gene Functions (最长公共子序列变形)
题意:有两个代表基因序列的字符串s1和s2,在两个基因序列中通过添加"-"来使得两个序列等长:其中每对基因匹配时会形成题中图片所示匹配值,求所能得到的总的最大匹配值. 题解:这题运 ...
- C++ Development Library
C/C++ 开发库 | C/C++ Development Library 这里收集一些著名的 C/C++ 开发库.SDK.类库.可复用类与结构代码 等信息,列举它们的介绍.参考和网站链接,为各位 C ...
- 【c语言】字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成“%20”
// 字符串替换空格:请实现一个函数,把字符串中的每一个空格替换成"%20". // 比如输入"we are happy.",则输出"we%20are ...
- AAC帧格式及编码介绍
参考资料: AAC以adts格式封装的分析:http://wenku.baidu.com/view/45c755fd910ef12d2af9e74c.html aac编码介绍:http://wenku ...
- Java语言中的程序流程控制
(1. 流程控制 有三种基本技术可以改变程序的控制流程: A.调用方法 :将导致控制流程离开当前方法,转移到被调用的方法. B.选择 : a. if / else 语句 b. switch语句 ...
- 浅谈自学Python之路(day2)
今天的主要内容是: 标准库 数据类型知识 数据运算 三元运算 bytes类型 字符串操作 字典 集合 标准库 Python的强大之处在于他有非常丰富和强大的标准库和第三方库,几乎你想实现的任何功能都有 ...
- 如何通过免费开源ERP Odoo实现企业数字化转型深度分析(一)
本文来自<开源智造企业数字化转型报告白皮书>的精选内容章节.请勿转载.欢迎您反馈阅读意见. 引言 在由消费者驱动的数字经济时代,创新之势锐不可挡.变革步伐从未如此迅速,并且还会越来越快.对 ...
- 微信小程序获取当前所在城市
本篇文章主要讲解在微信小程序中,如何利用微信自带的api(wx.getLocation())结合百度地图的逆地址解析api来获取当前所在城市名. 实现起来也比较简单,步骤为: 1--利用微信小程序接口 ...