社区讨论

自闭了,QwQ

P2045方格取数加强版参与者 2已保存回复 1

讨论操作

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

当前回复
1 条
当前快照
1 份
快照标识符
@mi7z4vkx
此快照首次捕获于
2025/11/21 05:59
4 个月前
此快照最后确认于
2025/11/21 05:59
4 个月前
查看原帖
CPP
#include<iostream>
#include<cstdio> 
#include<cstring>
#include<queue> 
using namespace std;
const int N=50*50*4+5;
int ver[N],nexts[N],head[N],edge[N],val[N],tot=1;
void add(int x,int y,int z,int c)
{
	ver[++tot]=y,edge[tot]=z,val[tot]=c;
	nexts[tot]=head[x],head[x]=tot;
	ver[++tot]=x,edge[tot]=0,val[tot]=-c;
	nexts[tot]=head[y],head[y]=tot;
}
int incf[N],vis[N],dis[N],pre[N],ans,n,k,s,t;
inline bool spfa()
{
	queue<int>q;
	memset(dis,-0x3f,sizeof(dis));
	memset(vis,0,sizeof(vis));
	incf[s]=0x3f3f3f3f,dis[s]=0;
	q.push(s);
	while(!q.empty())
	{
		int x=q.front();q.pop();vis[x]=0;
		for(int i=head[x];i;i=nexts[i])
		{
			if(!edge[i])continue;
			int v=ver[i];
			if(dis[v]<dis[x]+val[i])
			{
				dis[v]=dis[x]+val[i];
				incf[v]=min(incf[x],edge[i]);
				pre[v]=i;
				if(!vis[v])vis[v]=1,q.push(v);	
			}	
		}
	} 
	if(dis[t]!=0x3f3f3f3f)return true;
	return false;
}

inline void update()
{
	int x=t;
	while(x!=s)
	{
		int i=pre[x];
		edge[i]-=incf[t];
		edge[i^1]+=incf[t];
		x=ver[i^1];
	};
	ans+=dis[t]*incf[t];
}

inline int num(int i,int j,int k)
{
	return (i-1)*n+j+k*n*n;
}

int main()
{
	scanf("%d%d",&n,&k);
	s=1,t=2*n*n;
	for(int i=1;i<=n;i++)
	{
		for(int j=1;j<=n;j++)
		{
			int c;
			scanf("%d",&c);
			add(num(i,j,0),num(i,j,1),1,c);
			add(num(i,j,0),num(i,j,1),k-1,0);
			if(j!=n)add(num(i,j,1),num(i,j+1,0),k,0);
			if(i!=n)add(num(i,j,1),num(i+1,j,0),k,0);
		} 
	} 
if(spfa())update();
	printf("%d\n",ans);
	return 0;
}

回复

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

正在加载回复...