求助P2774,WA64分,代码如下:
#include <bits/stdc++.h>
using namespace std;
int xw[1005],hd[9999999],dp[9999999],n,m,s,t,p[1005][1005],cnt = 1,dx[5] = {0,0,0,-1,1},dy[5] = {0,1,-1,0,0};
struct edge
{
int v,nt;
long long w;
}e[9999999];
int fun(int x,int y)
{
return (y - 1) * n + x;
}
void add(int u,int v,int w)
{
e[++cnt].w = w;
e[cnt].v = v;
e[cnt].nt = hd[u];
hd[u] = cnt;
}
int bfs()
{
queue<int> q;
q.push(s);
memset(dp,0,sizeof(dp));
dp[s] = 1;
xw[s] = hd[s];
while(!q.empty())
{
int u = q.front();
q.pop();
for(int i = hd[u];i != 0;i = e[i].nt)
{
int v = e[i].v;
xw[v] = hd[v];
if(e[i].w && dp[v] == 0)
{
dp[v] = dp[u] + 1;
q.push(v);
if(v == t)
{
return 1;
}
}
}
}
return 0;
}
long long dfs(int u,long long f)
{
long long sum = 0;
if(u == t)
{
return f;
}
for(int i = xw[u];i != 0;i = e[i].nt)
{
if(f == 0)
{
break;
}
int v = e[i].v;
xw[u] = i;
if(e[i].w != 0 && dp[v] == dp[u] + 1)
{
long long k = dfs(v,min(f,e[i].w));
if(k == 0)
{
dp[v] = 0;
}
e[i].w -= k;
e[i ^ 1].w += k;
sum += k;
f -= k;
}
}
return sum;
}
int main()
{
scanf("%d%d",&m,&n);
s = 0;
t = m * n + m + n;
long long sum = 0;
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
scanf("%d",&p[i][j]);
sum += p[i][j];
}
}
for(int i = 1;i <= m;i++)
{
for(int j = 1;j <= n;j++)
{
if(fun(j,i) % 2 == 0)
{
add(fun(j,i),t,p[i][j]);
add(t,fun(j,i),0);
continue;
}
add(s,fun(j,i),p[i][j]);
add(fun(j,i),s,0);
for(int k = 1;k <= 4;k++)
{
int x = j + dx[k],y = i + dy[k];
if(x >= 1 && x <= n && y >= 1 && y <= m)
{
add(fun(j,i),fun(x,y),0x3f3f3f3f);
add(fun(x,y),fun(j,i),0);
}
}
}
}
long long maxa = 0;
while(bfs() == 1)
{
maxa += dfs(s,0x3f3f3f3f);
}
printf("%lld",sum - maxa);
return 0;
}
玄关*3,求助各位路过的大佬,急!!!