您的位置:首页 > 其它

hdu(1569)方格取数(2)(dinic算法)

2013-08-16 10:25 225 查看
ek算法效率太低,在这会超时,

用dinic算法,还不错。。

#include"stdio.h"

#include"string.h"

#define inf 0x7fffffff

#define M 20000

int n,m,s,t,adj[M],dis[M];

int q[M],p[M],sum;

struct point

{

int v,u;

int flow,next;

}map[M];

int min(int a,int b)

{

a=a>b?b:a;

return a;

}

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

{

map[sum].u=u,map[sum].v=v,map[sum].flow=w,map[sum].next=adj[u];

adj[u]=sum;sum++;

map[sum].u=v,map[sum].v=u,map[sum].flow=0,map[sum].next=adj[v];

adj[v]=sum;sum++;

}

int bfs()

{

int i,x,v,tail=0,head=0;

memset(dis,0,sizeof(dis));

dis[s]=1;

q[tail++]=s;

while(head<tail)

{

x=q[head++];

for(i=adj[x];i!=-1;i=map[i].next)

{

v=map[i].v;

if(map[i].flow&&dis[v]==0)

{

dis[v]=dis[x]+1;

if(v==t)

return 1;

q[tail++]=v;

}

}

}

return 0;

}

int dfs(int s,int limit)

{

if(s==t)

return limit;

int i,temp,cost=0,v;

for(i=adj[s];i!=-1;i=map[i].next)

{

v=map[i].v;

if(map[i].flow&&dis[s]==dis[v]-1)

{

temp=dfs(v,min(limit-cost,map[i].flow));

if(temp>0)

{

map[i].flow-=temp;

map[i^1].flow+=temp;

cost+=temp;

if(limit==cost)

break;

}

else

dis[v]=-1;

}

}

return cost;

}

int dinic()

{

int ans=0;

while(bfs())

{

ans+=dfs(s,inf);

}

return ans;

}

int main()

{

int i,k,ss;

while(scanf("%d%d",&n,&m)!=EOF)

{

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

memset(p,0,sizeof(p));

s=0,sum=0;t=n*m+1;ss=0;

for(i=1;i<=n*m;i++)

{

scanf("%d",&k);

ss+=k;

if(i>m)

p[i]=(p[i-m]+1)%2;

else

p[i]=(p[i-1]+1)%2;

if(p[i]==1)

{

insert(0,i,k);

if(i%m!=1)

insert(i,i-1,inf);

if(i%m!=0)

insert(i,i+1,inf);

if(i>m)

insert(i,i-m,inf);

if(i<=m*(n-1))

insert(i,i+m,inf);

}

else

insert(i,t,k);

}

printf("%d\n",ss-dinic());

}

return 0;

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