Shoot the Bullet|东方文花帖,洛谷 P5192,有源汇上下界最大流

本文详细介绍了如何通过构建特殊的网络流图解决有源汇上下界的最大流问题,包括将问题转化为无源汇上下界可行流的步骤,并提供了具体的实现代码。

正题

      板子

      有源汇上下界最大流可以通过跑完有源汇上下界可行流后,跑一遍从源到汇的最大流求解.

      有源汇上下界可行流可以通过加一条从汇到源的无穷容量边,转化成无源汇上下界可行流来求解.

      无源汇上下界可行流可以通过强行先假设下界已经流满,建立超级源汇,若一个点入度>出度,那么就从超级源向该店连一条容量为入度-出度的边,若一个点出度>入度,那么就从该点向超级汇连一条容量为出度-入度的边,判断是否有满足S割集只有超级源来求解.

      注意最后跑最大流的时候,要么把可行流的流量记下来(也就是那条汇源边的流量)再加上删去该边的最大流,要么就直接跑最大流输出,啥都不用加,因为肯定会把汇源那条边的流量反向增广,数值也恰好等于可行流的流量.

      而超级源超级汇可以不用理,因为增广路不可能经过超级源汇,这个显然.

#include<bits/stdc++.h>
using namespace std;

const int N=2010,M=200010;
struct edge{
	int y,nex,c;
}s[M<<1];
int first[N],head[N],len=1,op[N],d[N],qs[N],st,ed;
int n,m,s1,t1,s2,t2;

void ins(int x,int y,int c){s[++len]=(edge){y,first[x],c};first[x]=len;}

bool bfs(int S,int T){
	for(int i=1;i<=n+m+4;i++) first[i]=head[i],d[i]=0;
	d[qs[st=ed=1]=S]=1;
	while(st<=ed){
		int x=qs[st++];
		for(int i=first[x];i;i=s[i].nex) if(s[i].c && !d[s[i].y]){
			d[s[i].y]=d[x]+1;
			qs[++ed]=s[i].y;
		}
	}
	return d[T]!=0;
}

int dfs(int x,int T,int t){
	if(x==T) return t;
	int tot=0;
	for(int&i=first[x];i!=0;i=s[i].nex) if(d[s[i].y]==d[x]+1 && s[i].c){
		int now=dfs(s[i].y,T,min(t-tot,s[i].c));
		s[i].c-=now;s[i^1].c+=now;tot+=now;
		if(tot==t) break;
	}
	return tot;
}

long long Dinic(int S,int T){
	long long tot=0;
	int dx=0;
	while(bfs(S,T)){
		dx=dfs(S,T,2e9);
		while(dx) tot+=dx,dx=dfs(S,T,2e9);
	}
	return tot;
}

int main(){
	while(~scanf("%d %d",&n,&m)){
		s1=n+m+1;t1=n+m+2;s2=n+m+3;t2=n+m+4;
		for(int i=1;i<=n+m+4;i++) first[i]=head[i]=op[i]=0;len=1;
		int x,ans;
		long long tot=0;
		int C,D,T,L,R;
		for(int i=1;i<=m;i++){
			scanf("%d",&x),op[n+i]-=x;op[t1]+=x;
			ins(n+i,t1,2e9),ins(t1,n+i,0);
		}
		for(int i=1;i<=n;i++){
			scanf("%d %d",&C,&D);
			ins(s1,i,D),ins(i,s1,0);
			while(C--){
				scanf("%d %d %d",&T,&L,&R);T++;
				op[i]-=L;op[n+T]+=L;
				ins(i,n+T,R-L);ins(n+T,i,0);
			}
		}
		ins(t1,s1,2e9);ins(s1,t1,0);ans=len;
		for(int i=1;i<=n+m+2;i++) 
			if(op[i]>0) ins(s2,i,op[i]),ins(i,s2,0),tot+=op[i];
			else if(op[i]<0) ins(i,t2,-op[i]),ins(t2,i,0);
		for(int i=1;i<=n+m+4;i++) head[i]=first[i];
		if(Dinic(s2,t2)!=tot) printf("-1\n\n");
		else tot=s[ans].c,s[ans].c=s[ans^1].c=0,printf("%lld\n\n",tot+Dinic(s1,t1));
	}
}

 

基于径向基函数神经网络RBFNN的自适应滑模控制学习(Matlab代码实现)内容概要:本文介绍了基于径向基函数神经网络(RBFNN)的自适应滑模控制方法,并提供了相应的Matlab代码实现。该方法结合了RBF神经网络的非线性逼近能力和滑模控制的强鲁棒性,用于解决复杂系统的控制问题,尤其适用于存在不确定性和外部干扰的动态系统。文中详细阐述了控制算法的设计思路、RBFNN的结构与权重更新机制、滑模面的构建以及自适应律的推导过程,并通过Matlab仿真验证了所提方法的有效性和稳定性。此外,文档还列举了大量相关的科研方向和技术应用,涵盖智能优化算法、机器学习、电力系统、路径规划等多个领域,展示了该技术的广泛应用前景。; 适合人群:具备一定自动控制理论基础和Matlab编程能力的研究生、科研人员及工程技术人员,特别是从事智能控制、非线性系统控制及相关领域的研究人员; 使用场景及目标:①学习和掌握RBF神经网络与滑模控制相结合的自适应控制策略设计方法;②应用于电机控制、机器人轨迹跟踪、电力电子系统等存在模型不确定性或外界扰动的实际控制系统中,提升控制精度与鲁棒性; 阅读建议:建议读者结合提供的Matlab代码进行仿真实践,深入理解算法实现细节,同时可参考文中提及的相关技术方向拓展研究思路,注重理论分析与仿真验证相结合。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值