首页 技术 正文
技术 2022年11月10日
0 收藏 759 点赞 3,619 浏览 1741 个字

传送门

我们可以把实验放在左边,仪器放在右边,点有点权,然后连对应的有向边,就是求一个最大权闭合图,可以转化为最小割来做(关于这具体是个啥……可以百度胡伯涛《最小割模型在信息学竞赛中的应用》)

总而言之,就是求一个图,每一个点有点权,闭合图就是若图中有点$u$,且原图中存在边$(u,v)$,那么点$v$也在图中。然后求一个最大权的闭合图即可(具体证明看上面)。最大权闭合图可以转化成下面那样建图之后求最小割

源点向所有实验连边,容量为收益,实验向对应仪器连边,容量为$inf$,仪器向汇点连边,容量为花费,求一个最小割就好了,然后答案就是收益总和减去最小割

然后考虑怎么求方案,因为最后一次bfs没有增广成功,而与源点想通的点就是闭合图中的点,所以只要最后一次分层图中$dep$不等于$-1$的点即可

 //minamoto
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#define inf 0x3f3f3f3f
using namespace std;
inline bool read(int &res){
res=;char ch=getchar();
while(!isdigit(ch)){if(ch=='\n') return false;ch=getchar();}
while(isdigit(ch)){res=res*+ch-'',ch=getchar();}
return ch!='\n';
}
const int N=,M=;
int ver[M],Next[M],head[N],edge[M],cur[N],tot=;
int dep[N],n,m,s,t,ans;
queue<int> q;
inline void add(int u,int v,int e){
ver[++tot]=v,Next[tot]=head[u],head[u]=tot,edge[tot]=e;
ver[++tot]=u,Next[tot]=head[v],head[v]=tot,edge[tot]=;
}
bool bfs(){
memset(dep,-,sizeof(dep));
for(int i=;i<=n+m+;++i) cur[i]=head[i];
q.push(s),dep[s]=;
while(!q.empty()){
int u=q.front();q.pop();
for(int i=head[u];i;i=Next[i]){
int v=ver[i];
if(dep[v]<&&edge[i])
dep[v]=dep[u]+,q.push(v);
}
}
return ~dep[t];
}
int dfs(int u,int limit){
if(!limit||u==t) return limit;
int flow=,f;
for(int i=cur[u];i;i=Next[i]){
int v=ver[i];cur[u]=i;
if(dep[v]==dep[u]+&&(f=dfs(v,min(limit,edge[i])))){
flow+=f,limit-=f;
edge[i]-=f,edge[i^]+=f;
if(!limit) break;
}
}
return flow;
}
int dinic(){
int flow=;
while(bfs()) flow+=dfs(s,inf);
return flow;
}
int main(){
scanf("%d%d",&m,&n);
s=,t=n+m+;
for(int i=,x;i<=m;++i){
scanf("%d",&x),ans+=x;
add(s,i,x);
while(read(x)) add(i,x+m,inf);
add(i,x+m,inf);
}
for(int i=m+,x;i<=n+m;++i){
scanf("%d",&x);
add(i,t,x);
}
ans-=dinic();
for(int i=;i<=m;++i)
if(~dep[i]) printf("%d ",i);
putchar();
for(int i=m+;i<=n+m;++i)
if(~dep[i]) printf("%d ",i-m);
putchar();
printf("%d\n",ans);
return ;
}
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,086
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,561
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,410
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,183
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,820
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,903