【[国家集训队2011]happiness】别裁伪体亲风雅,转益多师是汝师。这篇文章主要讲述[国家集训队2011]happiness相关的知识,希望能为你提供帮助。
pragma comment(linker, "
/STACK:1024000000,1024000000"
)
include
int n,s,q,dis[2000011],t,l,cur[200051],m,tot,cnt;
int id[101][101],a[101][101],b[101][101],a1[101][101],b1[101][101],a2[101][101],b2[101][101];
struct po
{
int nxt,to,w;
}edge[MAXM];
int head[MAXN],dep[MAXN],num=-1;
inline int read()
{
int x=0,c=1;
char ch=‘ ‘;
while((ch>
‘9‘||ch<
‘0‘)&
&
ch!=‘-‘)ch=getchar();
while(ch==‘-‘)c=-1,ch=getchar();
while(ch<
=‘9‘&
&
ch>
=‘0‘)x=x10+ch-‘0‘,ch=getchar();
return xc;
}
inline void add_edge(int from,int to,int w)
{
edge[++num].nxt=head[from];
edge[num].to=to;
edge[num].w=w;
head[from]=num;
}
inline void add(int from,int to,int w)
{
add_edge(from,to,w);
add_edge(to,from,0);
}
inline bool bfs()
{
memset(dep,0,sizeof(dep));
queue
while(!q.empty())
q.pop();
q.push(s);
dep[s]=1;
while(!q.empty())
{
int u=q.front();
q.pop();
for(re int i=head[u];
i!=-1;
i=edge[i].nxt)
{
int v=edge[i].to;
if(dep[v]==0&
&
edge[i].w>
0)
{
dep[v]=dep[u]+1;
if(v==t)
return 1;
q.push(v);
}
}
}
return 0;
}
inline int dfs(int u,int dis)
{
if(u==t)
return dis;
int diss=0;
for(re int&
i=cur[u];
i!=-1;
i=edge[i].nxt)
{
int v=edge[i].to;
if(edge[i].w!=0&
&
dep[v]==dep[u]+1)
{
int check=dfs(v,min(dis,edge[i].w));
if(check>
0)
{
dis-=check;
diss+=check;
edge[i].w-=check;
edge[i^1].w+=check;
if(dis==0) break;
}
}
}
return diss;
}
inline int dinic()
{
int ans=0;
while(bfs())
{
for(re int i=0;
i<
=t;
i++)
cur[i]=head[i];
while(int d=dfs(s,inf))
ans+=d;
}
return ans;
}
inline int pd1(int x,int y)
{
int ans=0;
if(x!=1) ans+=a1[x-1][y];
if(x!=n) ans+=a1[x][y];
if(y!=1) ans+=a2[x][y-1];
if(y!=m) ans+=a2[x][y];
return ans;
}
inline int pd2(int x,int y)
{
int ans=0;
if(x!=1) ans+=b1[x-1][y];
if(x!=n) ans+=b1[x][y];
if(y!=1) ans+=b2[x][y-1];
if(y!=m) ans+=b2[x][y];
return ans;
}
int main()
{
memset(head,-1,sizeof(head));
n=read();
m=read();
s=0;
t=n
for(re int i=1;
i<
=n;
i++)
for(re int j=1;
j<
=m;
j++)
a[i][j]=read(),id[i][j]=++cnt,tot+=2a[i][j];
for(re int i=1;
i<
=n;
i++)
for(re int j=1;
j<
=m;
j++)
b[i][j]=read(),tot+=2b[i][j];
for(re int i=1;
i<
n;
i++)
for(re int j=1;
j<
=m;
j++)
a1[i][j]=read(),tot+=a1[i][j]+a1[i][j];
for(re int i=1;
i<
n;
i++)
for(re int j=1;
j<
=m;
j++)
b1[i][j]=read(),tot+=b1[i][j]+b1[i][j];
for(re int i=1;
i<
=n;
i++)
for(re int j=1;
j<
m;
j++)
a2[i][j]=read(),tot+=a2[i][j]+a2[i][j];
for(re int i=1;
i<
=n;
i++)
for(re int j=1;
j<
m;
j++)
b2[i][j]=read(),tot+=b2[i][j]+b2[i][j];
for(re int i=1;
i<
=n;
i++)
for(re int j=1;
j<
=m;
j++){
add(s,id[i][j],2a[i][j]+pd1(i,j));
add(id[i][j],t,2b[i][j]+pd2(i,j));
if(i!=1) add(id[i][j],id[i-1][j],a1[i-1][j]+b1[i-1][j]);
if(j!=1) add(id[i][j],id[i][j-1],a2[i][j-1]+b2[i][j-1]);
if(i!=n) add(id[i][j],id[i+1][j],a1[i][j]+b1[i][j]);
if(j!=m) add(id[i][j],id[i][j+1],a2[i][j]+b2[i][j]);
}
cout<
<
(tot-dinic())/2;
return 0;
}
推荐阅读
- Android 入门级教程 《第一行代码》 中遇到的问题
- DPI-1047: 64-bit Oracle Client library cannot be loaded: "D:appxygproduct11.2.0client_1i
- create-react-app 配置sass
- 在线一键生成安卓证书keystore文件
- Android stuidoMonkeyJenkins自动化测试初探
- 一键生成安卓证书keystore
- Android检测View的可见性
- 身为手机系统霸主,安卓对于谷歌来说算不算成功()
- Android XListView实现原理讲解及分析