由Hall定理,任意k种减肥药对应的药材数量>=k。考虑如何限制其恰好为k,可以将其看作是使对应的药材数量尽量少。

  考虑最小割。建一个二分图,左边的点表示减肥药,右边的点表示药材。减肥药和其使用的药材连inf边,这里的inf边较大,可以取到1e18;源向减肥药连inf-pi的边,表示不选这种减肥药会损失pi,这里的inf边较小,可以取到1e9;药材向汇连1e9的inf边,用来限制药材数量。容易发现最后的最小割中至少会割掉n条边,且割掉的边越少越优,而当恰好割掉n条边时,就对应了一种减肥药与药材数量相等的方案。直接跑最小割即可。这是一种针对多级限制的思想。

  1. #include<iostream>
  2. #include<cstdio>
  3. #include<cmath>
  4. #include<cstdlib>
  5. #include<cstring>
  6. #include<algorithm>
  7. using namespace std;
  8. #define ll long long
  9. #define N 610
  10. #define S 0
  11. #define T 601
  12. #define inf 1000000000
  13. #define INF 1000000000000000000ll
  14. char getc(){char c=getchar();while ((c<'A'||c>'Z')&&(c<'a'||c>'z')&&(c<''||c>'')) c=getchar();return c;}
  15. int gcd(int n,int m){return m==?n:gcd(m,n%m);}
  16. int read()
  17. {
  18. int x=,f=;char c=getchar();
  19. while (c<''||c>'') {if (c=='-') f=-;c=getchar();}
  20. while (c>=''&&c<='') x=(x<<)+(x<<)+(c^),c=getchar();
  21. return x*f;
  22. }
  23. int n,a[N],p[N],d[N],cur[N],q[N],t=-;
  24. ll ans;
  25. struct data{int to,nxt;ll cap,flow;
  26. }edge[N*N<<];
  27. void addedge(int x,int y,ll z)
  28. {
  29. t++;edge[t].to=y,edge[t].nxt=p[x],edge[t].cap=z,p[x]=t;
  30. t++;edge[t].to=x,edge[t].nxt=p[y],edge[t].cap=,p[y]=t;
  31. }
  32. bool bfs()
  33. {
  34. memset(d,,sizeof(d));d[S]=;
  35. int head=,tail=;q[]=S;
  36. do
  37. {
  38. int x=q[++head];
  39. for (int i=p[x];~i;i=edge[i].nxt)
  40. if (d[edge[i].to]==-&&edge[i].flow<edge[i].cap)
  41. {
  42. d[edge[i].to]=d[x]+;
  43. q[++tail]=edge[i].to;
  44. }
  45. }while (head<tail);
  46. return ~d[T];
  47. }
  48. ll work(int k,ll f)
  49. {
  50. if (k==T) return f;
  51. ll used=;
  52. for (int i=cur[k];~i;i=edge[i].nxt)
  53. if (d[k]+==d[edge[i].to])
  54. {
  55. ll w=work(edge[i].to,min(f-used,edge[i].cap-edge[i].flow));
  56. edge[i].flow+=w,edge[i^].flow-=w;
  57. if (edge[i].flow<edge[i].cap) cur[k]=i;
  58. used+=w;if (used==f) return f;
  59. }
  60. if (used==) d[k]=-;
  61. return used;
  62. }
  63. void dinic()
  64. {
  65. while (bfs())
  66. {
  67. memcpy(cur,p,sizeof(p));
  68. ans-=work(S,INF);
  69. }
  70. }
  71. int main()
  72. {
  73. #ifndef ONLINE_JUDGE
  74. freopen("loj6045.in","r",stdin);
  75. freopen("loj6045.out","w",stdout);
  76. const char LL[]="%I64d\n";
  77. #else
  78. const char LL[]="%lld\n";
  79. #endif
  80. n=read();
  81. memset(p,,sizeof(p));
  82. for (int i=;i<=n;i++)
  83. {
  84. int m=read();
  85. while (m--)
  86. {
  87. int x=read();
  88. addedge(i,n+x,INF);
  89. }
  90. }
  91. for (int i=;i<=n;i++) a[i]=read();
  92. for (int i=;i<=n;i++) addedge(S,i,inf-a[i]),ans+=inf-a[i];
  93. for (int i=;i<=n;i++) addedge(n+i,T,inf);
  94. dinic();
  95. cout<<-ans;
  96. return ;
  97. }

LOJ6045 雅礼集训 2017 Day8 价(最小割)的更多相关文章

  1. $loj\ 6045$ [雅礼集训 $2017\ Day8$] 价 网络流

    正解:网络流 解题报告: 传送门$QwQ$ 这题还,挺有趣的我$jio$得. 考虑依然先是照着最小割的模子建图呗,然后从意义上来分析,割一条边就相当于不吃一种减肥药/买一种药材.由已知得,买的药材数量 ...

  2. LOJ_6045_「雅礼集训 2017 Day8」价 _最小割

    LOJ_6045_「雅礼集训 2017 Day8」价 _最小割 描述: 有$n$种减肥药,$n$种药材,每种减肥药有一些对应的药材和一个收益. 假设选择吃下$K$种减肥药,那么需要这$K$种减肥药包含 ...

  3. 【LYOI 212】「雅礼集训 2017 Day8」价(二分匹配+最大权闭合子图)

    「雅礼集训 2017 Day8」价 内存限制: 512 MiB时间限制: 1000 ms 输入文件: z.in输出文件: z.out   [分析] 蛤?一开始看错题了,但是也没有改,因为不会做. 一开 ...

  4. loj #6046. 「雅礼集训 2017 Day8」爷

    #6046. 「雅礼集训 2017 Day8」爷 题目描述 如果你对山口丁和 G&P 没有兴趣,可以无视题目背景,因为你估计看不懂 …… 在第 63 回战车道全国高中生大赛中,军神西住美穗带领 ...

  5. loj6045 「雅礼集训 2017 Day8」价

    我们考虑最小割. 我一开始觉得是裸的最小割,就直接S到每个减肥药连up+p[i]的边,减肥药到药材连inf边,药材到T连up,然后得到了40分的好成绩. 之后我发现这是一个假的最小割,最小割割的是代价 ...

  6. LOJ#6045. 「雅礼集训 2017 Day8」价(最小割)

    题面 传送门 题解 首先先把所有权值取个相反数来求最大收益,因为最小收益很奇怪 然后建图如下:\(S\to\)药,容量\(\inf+p_i\),药\(\to\)药材,容量\(\inf\),药材\(\t ...

  7. 【LOJ6045】「雅礼集训 2017 Day8」价(网络流)

    点此看题面 大致题意: 有\(n\)种药,每种药有一个权值,且使用了若干种药材.让你选择若干种药,使得药的数量与所使用的药材并集大小相等,求最小权值总和. 网络流 \(hl666\):这种数据范围,一 ...

  8. 【思维题 最大权闭合子图】loj#6045. 「雅礼集训 2017 Day8」价

    又是经典模型的好题目 题目描述 人类智慧之神 zhangzj 最近有点胖,所以要减肥,他买了 NN 种减肥药,发现每种减肥药使用了若干种药材,总共正好有 NN 种不同的药材. 经过他的人脑实验,他发现 ...

  9. [LOJ#6044]. 「雅礼集训 2017 Day8」共[二分图、prufer序列]

    题意 题目链接 分析 钦定 \(k\) 个点作为深度为奇数的点,有 \(\binom{n-1}{k-1}\) 种方案. 将树黑白染色,这张完全二分图的生成树的个数就是我们钦定 \(k\) 个点之后合法 ...

随机推荐

  1. Luogu P1525 关押罪犯

    传送门 首先 这是一个并查集= = 这道题其实明白了还挺简单的qwq 思路: 因为只看仇恨值最大的一对儿,所以把他们从大到小排序,越大的就尽量分开,直到不能再分为止qwq q[x]表示x最大的敌人(x ...

  2. C语言中getch()、getche()和getchar()

    本文章为转载文章,文档贡献者wdzhangxiang 个人网址:www.baidu.com/p/wdzhangxiang 首先不要忘了,要用getch()必须引入头文件conio.h,以前学C语言的时 ...

  3. php中按值传递和按引用传递的一个问题

    php中传递变量默认是按照值传递. 简单举个例子: <?php function testArray($arr){// &$arr $arr = array(1,2,3,); } $ar ...

  4. 安卓自动化测试案例(跑在MonkeyRunner上)

    首先文件所在目录: MonkeyRunner所在目录: 运行命令(通过cd 命令  进入Tools目录下): 运行脚本:monkeyrunner.bat ..\honeywell\jsq.py 源文件 ...

  5. 【php增删改查实例】第十五节 - 用户管理模块(删除确认)

    假如有一天,用户找到你,说万一不小心手一抖,就点击了删除用户,不太好.能不能再误点的时候,再给个确认框,让用户进行二次确认. OK,用户是上帝.这边我们可以考虑用confirm方法进行开发. 参考代码 ...

  6. java 代码获取视频时长

    package test; import it.sauronsoftware.jave.Encoder; import it.sauronsoftware.jave.MultimediaInfo; i ...

  7. Spring 中配置log4j日志功能

    一,添加log4j依赖包 可从官网上下载该依赖包log4j-x.x.xx.jar,下载后 build path,添加依赖包 二,创建 log4j.properties 配置文件 log4j.prope ...

  8. Node.js系列-express(下)

    前言 距上次更新博客又两个月多了,这两个月内除了上班时间忙公司的项目外,下班后也没有闲着,做了点外包,有小程序的,管理端的项目.也可能那段时间做的外包项目也都比较急,所以晚上都搞到一点左右睡,严重的压 ...

  9. Ionic 2.0 相关资料

    原文发表于我的技术博客 本文汇总了学习 Ionic 2 的相关资料,也算是一个 Ionic Awesome 列表,供大家参考,有需要分享的可以留言. 原文发表于我的技术博客 1. 文档 1.1 Ion ...

  10. React.js 入门与实战之开发适配PC端及移动端新闻头条平台课程上线了

    原文发表于我的技术博客 我在慕课网的「React.js 入门与实战之开发适配PC端及移动端新闻头条平台」课程已经上线了,文章中是目前整个课程的大纲,以后此课程还会保持持续更新,此大纲文档也会保持更新, ...