LOJ6045 雅礼集训 2017 Day8 价(最小割)
由Hall定理,任意k种减肥药对应的药材数量>=k。考虑如何限制其恰好为k,可以将其看作是使对应的药材数量尽量少。
考虑最小割。建一个二分图,左边的点表示减肥药,右边的点表示药材。减肥药和其使用的药材连inf边,这里的inf边较大,可以取到1e18;源向减肥药连inf-pi的边,表示不选这种减肥药会损失pi,这里的inf边较小,可以取到1e9;药材向汇连1e9的inf边,用来限制药材数量。容易发现最后的最小割中至少会割掉n条边,且割掉的边越少越优,而当恰好割掉n条边时,就对应了一种减肥药与药材数量相等的方案。直接跑最小割即可。这是一种针对多级限制的思想。
- #include<iostream>
- #include<cstdio>
- #include<cmath>
- #include<cstdlib>
- #include<cstring>
- #include<algorithm>
- using namespace std;
- #define ll long long
- #define N 610
- #define S 0
- #define T 601
- #define inf 1000000000
- #define INF 1000000000000000000ll
- char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
- int gcd(int n,int m){return m==?n:gcd(m,n%m);}
- int read()
- {
- int x=,f=;char c=getchar();
- while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
- while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
- return x*f;
- }
- int n,a[N],p[N],d[N],cur[N],q[N],t=-;
- ll ans;
- struct data{int to,nxt;ll cap,flow;
- }edge[N*N<<];
- void addedge(int x,int y,ll z)
- {
- t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,p[x]=t;
- t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,p[y]=t;
- }
- bool bfs()
- {
- memset(d,,sizeof(d));d[S]=;
- int head=,tail=;q[]=S;
- do
- {
- int x=q[++head];
- for (int i=p[x];~i;i=edge[i].nxt)
- if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
- {
- d[edge[i].to]=d[x]+;
- q[++tail]=edge[i].to;
- }
- }while (head<tail);
- return ~d[T];
- }
- ll work(int k,ll f)
- {
- if (k==T) return f;
- ll used=;
- for (int i=cur[k];~i;i=edge[i].nxt)
- if (d[k]+==d[edge[i].to])
- {
- ll w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow));
- edge[i].flow+=w,edge[i^].flow-=w;
- if (edge[i].flow<edge[i].cap) cur[k]=i;
- used+=w;if (used==f) return f;
- }
- if (used==) d[k]=-;
- return used;
- }
- void dinic()
- {
- while (bfs())
- {
- memcpy(cur,p,sizeof(p));
- ans-=work(S,INF);
- }
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("loj6045.in","r",stdin);
- freopen("loj6045.out","w",stdout);
- const char LL[]="%I64d\n";
- #else
- const char LL[]="%lld\n";
- #endif
- n=read();
- memset(p,,sizeof(p));
- for (int i=;i<=n;i++)
- {
- int m=read();
- while (m--)
- {
- int x=read();
- addedge(i,n+x,INF);
- }
- }
- for (int i=;i<=n;i++) a[i]=read();
- for (int i=;i<=n;i++) addedge(S,i,inf-a[i]),ans+=inf-a[i];
- for (int i=;i<=n;i++) addedge(n+i,T,inf);
- dinic();
- cout<<-ans;
- return ;
- }
LOJ6045 雅礼集训 2017 Day8 价(最小割)的更多相关文章
- $loj\ 6045$ [雅礼集训 $2017\ Day8$] 价 网络流
正解:网络流 解题报告: 传送门$QwQ$ 这题还,挺有趣的我$jio$得. 考虑依然先是照着最小割的模子建图呗,然后从意义上来分析,割一条边就相当于不吃一种减肥药/买一种药材.由已知得,买的药材数量 ...
- LOJ_6045_「雅礼集训 2017 Day8」价 _最小割
LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...
- 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)
「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...
- loj #6046. 「雅礼集训 2017 Day8」爷
#6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...
- loj6045 「雅礼集训 2017 Day8」价
我们考虑最小割. 我一开始觉得是裸的最小割,就直接S到每个减肥药连up+p[i]的边,减肥药到药材连inf边,药材到T连up,然后得到了40分的好成绩. 之后我发现这是一个假的最小割,最小割割的是代价 ...
- LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)
题面 传送门 题解 首先先把所有权值取个相反数来求最大收益,因为最小收益很奇怪 然后建图如下:\(S\to\)药,容量\(\inf+p_i\),药\(\to\)药材,容量\(\inf\),药材\(\t ...
- 【LOJ6045】「雅礼集训 2017 Day8」价(网络流)
点此看题面 大致题意: 有\(n\)种药,每种药有一个权值,且使用了若干种药材.让你选择若干种药,使得药的数量与所使用的药材并集大小相等,求最小权值总和. 网络流 \(hl666\):这种数据范围,一 ...
- 【思维题 最大权闭合子图】loj#6045. 「雅礼集训 2017 Day8」价
又是经典模型的好题目 题目描述 人类智慧之神 zhangzj 最近有点胖,所以要减肥,他买了 NN 种减肥药,发现每种减肥药使用了若干种药材,总共正好有 NN 种不同的药材. 经过他的人脑实验,他发现 ...
- [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]
题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...
随机推荐
- Luogu P1525 关押罪犯
传送门 首先 这是一个并查集= = 这道题其实明白了还挺简单的qwq 思路: 因为只看仇恨值最大的一对儿,所以把他们从大到小排序,越大的就尽量分开,直到不能再分为止qwq q[x]表示x最大的敌人(x ...
- C语言中getch()、getche()和getchar()
本文章为转载文章,文档贡献者wdzhangxiang 个人网址:www.baidu.com/p/wdzhangxiang 首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时 ...
- php中按值传递和按引用传递的一个问题
php中传递变量默认是按照值传递. 简单举个例子: <?php function testArray($arr){// &$arr $arr = array(1,2,3,); } $ar ...
- 安卓自动化测试案例(跑在MonkeyRunner上)
首先文件所在目录: MonkeyRunner所在目录: 运行命令(通过cd 命令 进入Tools目录下): 运行脚本:monkeyrunner.bat ..\honeywell\jsq.py 源文件 ...
- 【php增删改查实例】第十五节 - 用户管理模块(删除确认)
假如有一天,用户找到你,说万一不小心手一抖,就点击了删除用户,不太好.能不能再误点的时候,再给个确认框,让用户进行二次确认. OK,用户是上帝.这边我们可以考虑用confirm方法进行开发. 参考代码 ...
- java 代码获取视频时长
package test; import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; i ...
- Spring 中配置log4j日志功能
一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包 二,创建 log4j.properties 配置文件 log4j.prope ...
- Node.js系列-express(下)
前言 距上次更新博客又两个月多了,这两个月内除了上班时间忙公司的项目外,下班后也没有闲着,做了点外包,有小程序的,管理端的项目.也可能那段时间做的外包项目也都比较急,所以晚上都搞到一点左右睡,严重的压 ...
- Ionic 2.0 相关资料
原文发表于我的技术博客 本文汇总了学习 Ionic 2 的相关资料,也算是一个 Ionic Awesome 列表,供大家参考,有需要分享的可以留言. 原文发表于我的技术博客 1. 文档 1.1 Ion ...
- React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了
原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...