求助灵异现象
查看原帖
求助灵异现象
593791
_Catluo_楼主2023/11/28 09:38

本地跑样例是对的,交上去后就不对了

代码:

#include<bits/stdc++.h>
using namespace std;
const int Inf=1e9;
int n,m;
int a[105][105];
struct Edge{
	int to,nxt,w;
}e[500005];
int head[10005],h[10005],tot=1,S,T;
int dis[10005];
inline void add(int u,int v,int W){
	e[++tot]=(Edge){v,head[u],W};
	head[u]=tot;
	e[++tot]=(Edge){u,head[v],0};
	head[v]=tot; 
}
inline int num(int X,int Y){return (X-1)*m+Y;}
int xx[4]={0,0,1,-1};
int yy[4]={1,-1,0,0};
bool bfs(){
	memset(dis,0,sizeof dis);
	queue<int>q;
	q.push(S);
	dis[S]=1;
	h[S]=head[S];
	while(!q.empty()){
		int x=q.front();
		q.pop();
		for(int i=head[x];i;i=e[i].nxt){
			int y=e[i].to;
			if(!dis[y]&&e[i].w){
				dis[y]=dis[x]+1;
				h[y]=head[y];
				q.push(y);
				if(y==T)return 1;
			}
		}
	}
	return 0;
}
int dfs(int x,int sum){
	if(x==T)return sum;
	int res=sum;
	for(int i=h[x];i&&sum;i=e[i].nxt){
		int y=e[i].to;
		h[x]=i;
		if((dis[y]==dis[x]+1)&&e[i].w){
			int tmp=dfs(y,min(sum,e[i].w));
			if(!tmp)dis[y]=0;
			sum-=tmp;
			e[i].w-=tmp;
			e[i^1].w+=tmp;
		}
	}
	return res-sum;
}
int Dinic(){
	int ans=0;
	while(bfs())ans+=dfs(S,Inf);
	return ans;
}
signed main(){
	cin>>n>>m;
	int sum=0;
	S=0,T=n*m+1;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++){
			cin>>a[i][j];
			sum+=a[i][j];
		}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if((i+j)&1)add(num(i,j),T,a[i][j]);
			else{
				add(S,num(i,j),a[i][j]);
				for(int l=0;l<4;l++){
					int X=i+xx[l];
					int Y=j+yy[l];
					if(X<0||X>n||Y<0||Y>m)continue;
					add(num(i,j),num(X,Y),Inf);
				}
			}
		}
	}
	cout<<sum-Dinic();
	return 0;
}
2023/11/28 09:38
加载中...