正解:网络流

解题报告:

传送门$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$

#include<bits/stdc++.h>
using namespace std;
#define il inline
#define gc getchar()
#define t(i) edge[i].to
#define w(i) edge[i].wei
#define n(i) edge[i].nxt
#define ri register int
#define rb register int
#define rc register char
#define rp(i,x,y) for(ri i=x;i<=y;++i)
#define my(i,x,y) for(ri i=x;i>=y;--i)
#define e(i,x) for(ri i=head[x];~i;i=n(i)) const int N=+,M=+,inf=1e8;
int n,dep[N],head[N],cur[N],S,T,ed_cnt=-,as;
struct ed{int to,nxt,wei;}edge[N<<]; il int read()
{
rc ch=gc;ri x=;rb y=;
while(ch!='-' && (ch>'' || ch<''))ch=gc;
if(ch=='-')ch=gc,y=;
while(ch>='' && ch<='')x=(x<<)+(x<<)+(ch^''),ch=gc;
return y?x:-x;
}
il void ad(ri x,ri y,ri z)
{edge[++ed_cnt]=(ed){x,head[y],z};head[y]=ed_cnt;edge[++ed_cnt]=(ed){y,head[x],};head[x]=ed_cnt;}
il bool bfs()
{
queue<int>Q;Q.push(S);memset(dep,,sizeof(dep));dep[S]=;
while(!Q.empty())
{
ri nw=Q.front();Q.pop();
e(i,nw)if(w(i) && !dep[t(i)]){dep[t(i)]=dep[nw]+,Q.push(t(i));if(t(i)==T)return ;}
}
return ;
}
il int dfs(ri nw,ri flow)
{
if(nw==T || !flow)return flow;ri ret=;
for(ri &i=cur[nw];~i;i=n(i))
if(w(i) && dep[t(i)]==dep[nw]+)
{ri tmp=dfs(t(i),min(flow,w(i)));ret+=tmp,w(i)-=tmp;w(i^)+=tmp,flow-=tmp;}
return ret;
}
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;} int main()
{
//freopen("6045.in","r",stdin);freopen("6045.out","w",stdout);
n=read();S=;T=n<<|;memset(head,-,sizeof(head));
rp(i,,n)ad(T,n+i,inf);
rp(i,,n){ri t=read();while(t--){ri tmp=read();ad(tmp+n,i,inf);}}
rp(i,,n){ri tmp=read();ad(i,S,inf-tmp);as-=inf-tmp;}
printf("%d\n",as+dinic());
return ;
}

随机推荐

  1. PHP5.2 汉字json_encode

    //对汉字编码 private function url_encode($str) { if(is_array($str)) { foreach($str as $key=>$value) { ...

  2. 《C语言深度解剖》学习笔记之指针和数组

    第4章 指针和数组 1. int *p=NULL 和 *p=NULL 有什么区别 int *p = NULL; 第一句代码的意思是:定义一个指针变量p,其指向的内存里面保存的是 int类型的数据:在定 ...

  3. pytorch旧版安装

    https://pytorch.org/get-started/previous-versions 可以直接下载文件 用 pip 直接在下载目录安装就可以了

  4. 逗号分隔的字符串转换为Python中的列表 split

    将逗号分隔的字符串转换为Python中的列表   给定一个字符串: 它是由逗号分隔的几个值的序列: mStr = '192.168.1.1,192.168.1.2,192.168.1.3' 如何将字符 ...

  5. @codeforces - 1205E@ Expected Value Again

    目录 @description@ @solution@ @part - 1@ @part - 2@ @part - 3@ @solution@ @details@ @description@ 给定两个 ...

  6. Laravel引入第三方库的方法

    https://blog.csdn.net/will5451/article/details/52472695 1.首先在app目录下创建一个新的文件夹,命名libs(可自定义) 2.(可选)考虑到后 ...

  7. HTML静态网页--JavaScript-语法

    1.基本数据类型: 字符串.小数.整数.日期时间.布尔型等. 2.变量: 都是通用类型var,可以随便存储其他类型的值,可以直接使用,不用定义,但习惯上定义.定义变量:var a:所有变量定义 都用v ...

  8. H3C ISDN功能组和参考点

  9. java什么是方法(Method)?

    方法是一组为了实现特定功能的代码块的集合.方法在语法上的功能主要有以下两个: ①:结构化代码 将代码按照功能进行组织,使代码的结构比较清晰,容易阅读和修改,也就是程序的可维护性强. ②:减少代码重复 ...

  10. C# 配置文件存储 各种序列化算法性能比较

    本文比较多个方式进行配置文件的存储,对比各个不同算法的读写性能. 在应用软件启动的时候,需要读取配置文件,但是启动的性能很重要,所以需要有一个很快的读取配置文件的方法. 如果你不想看过程,那么请看拖动 ...