社区讨论
自闭了,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 条回复,欢迎继续交流。
正在加载回复...