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;
}
用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;
}
相关文章推荐
- HDU 1569 方格取数(2) dinic算法
- 【网络流第五弹】最大点权独立集 ——HDU 1569 方格取数(2)
- hdu 1569 方格取数(2)【最大权独立集合-------最大流Edmond_Karp】
- 网络流(最大流) HDU 1565 方格取数(1) HDU 1569 方格取数(2)
- 独立最小【网络流第五弹】最大点权独立集 ——HDU 1569 方格取数(2)
- HDU-1569 方格取数(2) 最小割最大流
- HDU 1565 1569 方格取数(最大点权独立集)
- hdu 1569 方格取数(2) 最大点权独立集
- HDU1569 方格取数(2) 网络流
- hdu1569-方格取数-二分图网络流
- HDU 1569 方格取数(2)(最大点权独立集)
- HDU 1569 - 方格取数(2) 二分图最大点权独立集(构图最大流解)
- HDU 1565 1569 方格取数(最大点权独立集)
- HDU_1569 方格取数(2) 最小割
- Round 6 F - 方格取数(2) HDU - 1569 网络流
- HDU 1569 方格取数(2) 最大点权独立集
- 方格取数(2) HDU - 1569(二分图最大点权独立集)
- HDU 1569 方格取数(2) (最小割)
- hdu - 1565 方格取数(1) && 1569 方格取数(2) (最大点权独立集)
- 【网络流】 HDU 1569 方格取数(2)