正解:网络流

解题报告:

传送门$QwQ$

这题还,挺有趣的我$jio$得.

考虑依然先是照着最小割的模子建图呗,然后从意义上来分析,割一条边就相当于不吃一种减肥药/买一种药材.由已知得,买的药材数量要和吃的减肥药数量相等,所以考虑只要满足割的边数恰好等于$n$就好$QwQ$

又因为要出现割的局面至少要割$n$条(有一、、显然,,,?懒得证了$QwQ$

所以现在就要考虑割的边数一定是最少的

那不显然使流量都特别大就能实现了嘛$QwQ$

又因为是要$\sum P_{i}$取$min$,所以都变成$inf-p_{i}$就成

然后就做完辣!$over$

(感$jio$只大概说了下原理并没有详细说怎么建图?$QwQ$

就考虑减肥药和药材分别建一排点彼此之间连$inf$,药材和$T$连$inf$,$S$和减肥药连$inf-p_{i}$.

$over$

(还有就,我发现了一个双倍经验$QwQ$

  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define il inline
  4. #define gc getchar()
  5. #define t(i) edge[i].to
  6. #define w(i) edge[i].wei
  7. #define n(i) edge[i].nxt
  8. #define ri register int
  9. #define rb register int
  10. #define rc register char
  11. #define rp(i,x,y) for(ri i=x;i<=y;++i)
  12. #define my(i,x,y) for(ri i=x;i>=y;--i)
  13. #define e(i,x) for(ri i=head[x];~i;i=n(i))
  14.  
  15. const int N=+,M=+,inf=1e8;
  16. int n,dep[N],head[N],cur[N],S,T,ed_cnt=-,as;
  17. struct ed{int to,nxt,wei;}edge[N<<];
  18.  
  19. il int read()
  20. {
  21. rc ch=gc;ri x=;rb y=;
  22. while(ch!='-' && (ch>'' || ch<''))ch=gc;
  23. if(ch=='-')ch=gc,y=;
  24. while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
  25. return y?x:-x;
  26. }
  27. il void ad(ri x,ri y,ri z)
  28. {edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
  29. il bool bfs()
  30. {
  31. queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
  32. while(!Q.empty())
  33. {
  34. ri nw=Q.front();Q.pop();
  35. e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));if(t(i)==T)return ;}
  36. }
  37. return ;
  38. }
  39. il int dfs(ri nw,ri flow)
  40. {
  41. if(nw==T || !flow)return flow;ri ret=;
  42. for(ri &i=cur[nw];~i;i=n(i))
  43. if(w(i) && dep[t(i)]==dep[nw]+)
  44. {ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
  45. return ret;
  46. }
  47. il int dinic(){ri ret=;while(bfs()){rp(i,S,T)cur[i]=head[i];while(int d=dfs(S,inf))ret+=d;}return ret;}
  48.  
  49. int main()
  50. {
  51. //freopen("6045.in","r",stdin);freopen("6045.out","w",stdout);
  52. n=read();S=;T=n<<|;memset(head,-,sizeof(head));
  53. rp(i,,n)ad(T,n+i,inf);
  54. rp(i,,n){ri t=read();while(t--){ri tmp=read();ad(tmp+n,i,inf);}}
  55. rp(i,,n){ri tmp=read();ad(i,S,inf-tmp);as-=inf-tmp;}
  56. printf("%d\n",as+dinic());
  57. return ;
  58. }

随机推荐

  1. @AGC037 - E@ Reversing and Concatenating

    目录 @description@ @solution@ @accepted code@ @details@ @description@ 给定一个长度为 N 且只包含小写字母的字符串 S ,你可以执行 ...

  2. 从零学React Native之05混合开发

    本篇文章,我们主要讨论如何实现Android平台的混合开发. RN给Android端发送消息 首先打开Android Studio, Open工程, 在React Native项目目录下选择andro ...

  3. android学习——Android Layout标签之-viewStub,requestFocus,merge,include

    定义Android Layout(XML)时,有四个比较特别的标签是非常重要的,其中有三个是与资源复用有关,分别是<viewStub/>, <requestFocus />, ...

  4. 学习meta标签http-equiv属性

    meta标签http-equiv属性的使用:meta标签http-equiv属性的使用

  5. hdu 1532 Drainage Ditches(最大流模板题)

    Drainage Ditches Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) ...

  6. 2011年NOIP普及组复赛题解

    题目涉及算法: 数字反转:模拟: 统计单词数:模拟: 瑞士轮:模拟/排序: 表达式的值:后缀表达式/DP. 数字反转 题目链接:https://www.luogu.org/problem/P1307 ...

  7. 用diiv实现多个方块居中嵌套--margin

    文章地址 https://www.cnblogs.com/sandraryan/ 案例:用diiv嵌套多个正方形,配合盒模型相关知识,使每个div在他的父元素上居中.(每个div中心点对齐) 涉及到m ...

  8. Python--day41--threading中的定时器Timer

    定时器Timer:定时开启线程 代码示例: #定时开启线程 import time from threading import Timer def func(): print('时间同步') #1-3 ...

  9. 整理了一下react16.7.0的webpack模板

    基本上react需要方法和依赖的库都引配好了.github地址:https://github.com/qianxiaoning/demo-react16.7.0 欢迎大家star或者fork呀~ te ...

  10. java 文件过滤器 java.io.FilenameFilter

    File 类里有方法: String[] list(FilenameFilter filter)    返回一个字符串数组,这些字符串指定此抽象路径名表示的目录中满足指定过滤器的文件和目录. File ...