您的位置:首页 > 其它

【bzoj1001】[BeiJing2006]狼抓兔子

2016-03-25 17:38 357 查看
最大流
数据有些鬼。。开小容易RE,开大就MLE。。

存双向边
然后直接跑dinic

注意读入有些复杂= =

速度还是跟得上的

Problem: 1001

User: YJY

Language: C++

Result: Accepted

Time:2004 ms

Memory:106744 kb


#include<algorithm>

#include<iostream>

#include<cstdlib>

#include<cstring>

#include<cstdio>

#include<vector>

#include<cmath>

#include<stack>

#include<queue>

using
namespace
std;


#define INF 0x7fffffff

#define MAXN 3000010


int
n,m;

int
ans,k;


struct
Node

{

int
to,next,v;

}e[MAXN<<1];


int
head[MAXN];

int
dis[MAXN],q[MAXN];


void
link(
int
u,
int
v,
int
w)

{

k++;

e[k].to=v;

e[k].v=w;

e[k].next=head[u];

head[u]=k;

}


bool
bfs()

{

queue<
int
>Q;

int
now;

memset
(dis,-1,
sizeof
(dis));

Q.push(1);

dis[1]=0;

while
(!Q.empty())

{

now=Q.front();

Q.pop();

for
(
int
i=head[now];i;i=e[i].next)

{

if
(e[i].v && dis[e[i].to]<0)

{

Q.push(e[i].to);

dis[e[i].to]=dis[now]+1; 

}

}

}

if
(dis[n*m]==-1)

return
0;

return
1;

}


int
dfs(
int
x,
int
f)

{

int
w,used=0;

if
(x==n*m)

return
f;

for
(
int
i=head[x];i;i=e[i].next)

{

if
(e[i].v && dis[e[i].to]==dis[x]+1)

{

w=f-used;

w=dfs(e[i].to,min(w,e[i].v));

e[i].v-=w;

e[i+1].v+=w;

used+=w;

if
(used==f)

return
f;

}

}

if
(!used)

dis[x]=-1;

return
used;

}


void
dinic()

{

while
(bfs())

ans+=dfs(1,INF);

}


int
main()

{

scanf
(
"%d%d"
,&n,&m);

int
x;

for
(
int
i=1;i<=n;i++)

for
(
int
j=1;j<m;j++)

{

scanf
(
"%d"
,&x);

link(m*(i-1)+j,m*(i-1)+j+1,x);

link(m*(i-1)+j+1,m*(i-1)+j,x);

}

for
(
int
i=1;i<n;i++)

for
(
int
j=1;j<=m;j++)

{

scanf
(
"%d"
,&x);

link(m*(i-1)+j,m*(i)+j,x);

link(m*(i)+j,m*(i-1)+j,x);

}

for
(
int
i=1;i<n;i++)

for
(
int
j=1;j<m;j++)

{

scanf
(
"%d"
,&x);

link(m*(i-1)+j,m*(i)+j+1,x);

link(m*(i)+j+1,m*(i-1)+j,x);

}

dinic();

printf
(
"%d"
,ans);

return
0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: