BZOJ P3438 小M的作物

本文深入讲解了最小割算法的应用及实现细节,通过一个具体的编程实例展示了如何使用最小割算法解决复杂网络流量问题,并介绍了关键的数据结构和算法流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最小割

#include<iostream>
#include<algorithm>
#include<cmath>
#include<cstring>
using namespace std;
const int inf=1000000000;
int head[3003];
int to[5100010],c[5100010];
int next[5100010],q[3003];
int d[3003],a[3003],b[3003];
int n,m,num,s,t,ans,sum;
void ins(int x,int y,int z){
	to[++num]=y;c[num]=z;next[num]=head[x];head[x]=num;
}
void addedge(int x,int y,int z){  
    ins(x,y,z);  ins(y,x,0);
}
bool bfs(){
    for(int i=s;i<=t;i++){
    	d[i]=-1;
	}
    int l=0,r=1;
    q[1]=s;d[s]=0;
    while(l<r){
        int x=q[++l];
        for(int p=head[x];p;p=next[p]){
        	if(c[p]&&d[to[p]]==-1){
           	 	d[to[p]]=d[x]+1;
            	q[++r]=to[p];
          	}
		}
    }
    if(d[t]==-1){
    	return 0;
	}else{
		return 1;
	}
}
int find(int x,int low){
    if (x==t||low==0){
    	return low;
	}
    int totflow=0;
    for(int p=head[x];p;p=next[p]){
    	if (c[p] && d[to[p]]==d[x]+1){
        	int a=find(to[p],min(low,c[p]));
        	c[p]-=a;
			c[p^1]+=a;
        	totflow+=a;
			low-=a;
        	if(low==0){
        		return totflow;
			}
     	}
	}
    if(low){
    	d[x]=-1;
	}
    return totflow;
}
void dinic(){
	while(bfs()){
		ans+=find(s,inf);
	}
}
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		sum+=a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
		sum+=b[i];
	}
	num=1;
	cin>>m;
	s=0,t=n+2*m+1;
	for(int i=1;i<=n;i++){
		addedge(s,i,b[i]);
		addedge(i,t,a[i]);
	}
	for(int i=1;i<=m;i++){
		int k,x,c1,c2;
		cin>>k>>c1>>c2;
		addedge(s,n+i*2,c2);
		addedge(n+i*2-1,t,c1);
		sum+=c1+c2;
		for(int j=1;j<=k;j++){
			cin>>x;
			addedge(x,n+i*2-1,inf);
			addedge(n+i*2,x,inf);
		}
	}
	dinic();
	cout<<sum-ans<<endl;
	return 0;
}
/*

in:
3
4 2 1
2 3 2
1
2 3 2 1 2

out:
11

*/


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值