社区讨论

46pts 求条

P4012深海机器人问题参与者 3已保存回复 3

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
3 条
当前快照
1 份
快照标识符
@mhjiczi9
此快照首次捕获于
2025/11/04 03:03
4 个月前
此快照最后确认于
2025/11/04 03:03
4 个月前
查看原帖
rt。
CPP
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const ll inf=8e18+7;
const int N=450,M=5050;
int ca,cb,n,m,cnt;
int pos[N][N];
int ss,tt;
ll ans;
int h[N],e[M],ne[M],idx;
ll w[M],c[M];
inline void add(int a,int b,ll x,ll y){
	e[idx]=b;
	ne[idx]=h[a];
	w[idx]=x;
	c[idx]=y;
	h[a]=idx++;
}
ll dis[N];
int vis[N],now[N];
inline bool spfa(){
	queue<int> q;
	for(int i=1;i<=cnt+2;i++){
		dis[i]=inf;
		vis[i]=0;
	}
	dis[ss]=0;
	vis[ss]=1;
	q.push(ss);
	while(q.size()){
		int p=q.front();
		vis[p]=0;
		q.pop();
		for(int i=h[p];i!=-1;i=ne[i]){
			int j=e[i];
			if(w[i] && dis[j]>dis[p]+c[i]){
				dis[j]=dis[p]+c[i];
				if(!vis[j]){
					vis[j]=1;
					q.push(j);
				}
			}
		}
	}
	return dis[tt]!=inf;
}
ll dfs(int x,ll su){
	if(x==tt) return su;
	ll res=0;
	vis[x]=1;
	for(int i=now[x];(i!=-1) && su;i=ne[i]){
		int j=e[i];
		now[x]=i;
		if(w[i]>0 && !vis[j] && dis[j]==dis[x]+c[i]){
			ll k=dfs(j,min(su,w[i]));
			res+=k;
			su-=k;
			w[i]-=k;
			w[i^1]+=k;
			ans+=c[i]*k;
		}
	}
	vis[x]=0;
	return res;
}
inline void dinic(){
	while(spfa()){
		for(int i=1;i<=cnt+2;i++) now[i]=h[i];
		while(dfs(ss,inf));
	}
}
int main(){
	memset(h,-1,sizeof h);
	scanf("%d%d",&ca,&cb);
	scanf("%d%d",&m,&n);
	for(int i=1;i<=n+1;i++) for(int j=1;j<=m+1;j++) pos[i][j]=(m+1)*(i-1)+j;
	cnt=(n+1)*(m+1);
	for(int i=1;i<=n+1;i++){
		for(int j=1;j<=m;j++){
			ll x;
			scanf("%lld",&x);
//			printf("%d %d %d %d\n",pos[i][j],pos[i][j+1],1,-x);
			add(pos[i][j],pos[i][j+1],1,-x);
			add(pos[i][j+1],pos[i][j],0,x);
			add(pos[i][j],pos[i][j+1],inf,0);
			add(pos[i][j+1],pos[i][j],0,0);
		}
	}
	for(int j=1;j<=m+1;j++){
		for(int i=1;i<=n;i++){
			ll x;
			scanf("%lld",&x);
//			printf("%d %d %d %d\n",pos[i][j],pos[i+1][j],1,-x);
			add(pos[i][j],pos[i+1][j],1,-x);
			add(pos[i+1][j],pos[i][j],0,x);
			add(pos[i][j],pos[i+1][j],inf,0);
			add(pos[i+1][j],pos[i][j],0,0);
		}
	}
	ss=cnt+1,tt=cnt+2;
	for(int i=1;i<=ca;i++){
		int k,x,y;
		scanf("%d%d%d",&k,&x,&y);
		x++,y++;
		add(ss,pos[x][y],k,0);
		add(pos[x][y],ss,0,0);
	} 
	for(int i=1;i<=cb;i++){
		int k,x,y;
		scanf("%d%d%d",&k,&x,&y);
		x++,y++;
		add(pos[x][y],tt,k,0);
		add(tt,pos[x][y],0,0);
	}
	dinic();
	printf("%lld",-ans);
}

回复

3 条回复,欢迎继续交流。

正在加载回复...