网络流写法最大费用最大流 最后一个WA掉了
#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
int S,T,m,n;
#define M 60
#define inf 10000000
#define N 60
bool vis[M*N+10];
int num[300000],d[30608],pre[100000],tot,head[90000];
struct aaa{
int to,next,c,w;
}a[400000];
bool spfa()
{
memset(d,-0x7f7f7f7f,sizeof(d));
queue<int> q;
q.push(S);
memset(vis,0,sizeof(vis));
memset(pre,-1,sizeof(pre));
vis[S]=true;
d[S]=0;
while(!q.empty())
{
int u=q.front();
q.pop();
vis[u]=false;
for(int i=head[u];i!=-1;i=a[i].next)
{
int v=a[i].to;
if(a[i].c)
{
if(d[v]<d[u]+a[i].w)
{
d[v]=d[u]+a[i].w;
pre[v]=i;
if(!vis[v])
q.push(v),vis[v]=true;
}
}
}
}
return pre[T]!=-1;
}
int maxflow()
{
int res=0;
while(spfa())
{
int flow=80000000;
for(int i=T;i!=S;i=a[pre[i]^1].to)
flow=min(flow,a[pre[i]].c);
for(int i=T;i!=S;i=a[pre[i]^1].to)
res+=a[pre[i]].w,a[pre[i]^1].c+=flow,a[pre[i]].c-=flow;
}
return res;
}
void add(int x,int y,int c,int w)
{
a[tot].to=y;
a[tot].c=c;
a[tot].w=w;
a[tot].next=head[x];
head[x]=tot++;
}
void add2(int x,int y,int c,int w)
{
add(x,y,c,w);
add(y,x,0,-w);
}
int main()
{
memset(head,-1,sizeof(head));
scanf("%d%d",&m,&n);
T=50000;
add2(S,1+m*n,2,0);
add2(m*n,T,2,0);
for(int i=1;i<=n*m;i++)
scanf("%d",&num[i]);
for(int i=1;i<m;i++)
for(int j=1;j<n;j++)
add2((i-1)*n+j+m*n,(i-1)*n+j+1,inf,0),add2((i-1)*n+j+m*n,i*n+j,inf,0);
for(int i=1;i<m;i++)
add2(i*n+m*n,(i+1)*n,inf,0);
for(int j=1;j<n;j++)
add2((m-1)*n+j+m*n,(m-1)*n+j+1,inf,0);
for(int i=1;i<=n*m;i++)
add2(i,i+m*n,1,num[i]);
printf("%d",maxflow());
return 0;
}