狼抓兔子c语言,[BZOJ]1001: [BeiJing2006]狼抓兔子

一道网络流的裸题,但是要注意双向边的建法,我因为太久没打过网络流,建多了很多重复的边,导致TLE。。。。。。

/**************************************************************

Problem: 1001

User: 200815147

Language: C++

Result: Accepted

Time:2060 ms

Memory:106292 kb

****************************************************************/

#include

#include

const int Q=1000005;

const int MAX=999999999;

int n,m,st,ed;

int p(int x,int y) {return (x-1)*m+y;}

struct edge

{

int y,d,next,other;

}a[6*Q];

int len=0,last[Q];

void ins(int x,int y,int d)

{

int t1=++len;

a[t1].y=y;a[t1].d=d;a[t1].next=last[x];last[x]=t1;

int t2=++len;

a[t2].y=x;a[t2].d=d;a[t2].next=last[y];last[y]=t2;

a[t1].other=t2;a[t2].other=t1;

}

int h[Q],list[Q];

bool build()

{

memset(h,0,sizeof(h));h[st]=1;

list[1]=st;

int head=1,tail=2;

while(head!=tail)

{

int x=list[head];

for(int i=last[x];i!=-1;i=a[i].next)

{

int y=a[i].y;

if(a[i].d>0 && h[y]==0)

{

h[y]=h[x]+1;

list[tail++]=y;

if(tail==Q-1) tail=1;

}

}

head++;

if(head==Q-1) head=1;

}

if(h[ed]>0) return true;

return false;

}

int mymin(int x,int y) {return x

int work(int x,int f)

{

if(x==ed) return f;

int s=0;

for(int i=last[x];i!=-1;i=a[i].next)

{

int y=a[i].y;

if(a[i].d>0 && h[y]==h[x]+1 && s

{

int t=work(y,mymin(f-s,a[i].d));

s+=t;a[a[i].other].d+=t;a[i].d-=t;

}

}

if(s==0) h[x]=0;

return s;

}

int main()

{

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

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

if(n==1&&m==1) {printf("0");return 0;}

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

{

for(int j=1;j

{

int d,num1=(i-1)*m+j;

scanf("%d",&d);

ins(num1,num1+1,d);

//ins(num1+1,num1,d);

}

}

for(int i=1;i

{

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

{

int d,num1=(i-1)*m+j,num2=num1+m;

scanf("%d",&d);

ins(num2,num1,d);

//ins(num1,num2,d);

}

}

for(int i=1;i

{

for(int j=1;j

{

int d,num1=(i-1)*m+j,num2=num1+m+1;

scanf("%d",&d);

ins(num2,num1,d);

//ins(num1,num2,d);

}

}

st=1;ed=n*m;

int ans=0;

while(build()==true)

{

//printf("ok\n");

ans+=work(st,MAX);

}

printf("%d",ans);

}


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部