您的位置:首页 > 理论基础 > 计算机网络

bzoj1001 狼抓兔子 网络流(水)

2016-08-12 16:05 176 查看
这道题正解不是网络流,但是网络流(最小割)在这种图上跑得飞起,就能水(2016.8.12)。直接贴代码。

#include<iostream>
#include<cstdio>
#include<queue>
using namespace std;
struct bian{
int to,cap;
}b[6000005];
int s,t;
int fst[1000005],nxt[6000005],tot=1;
void build(int f,int t,int d)
{
b[++tot].to=t;
b[tot].cap=d;
nxt[tot]=fst[f];
fst[f]=tot;
}
void insert(int f,int t,int d)
{
build(f,t,d);
build(t,f,d);
}
queue<int> q;
int d[1000005];
bool bfs()
{
for(int i=1;i<=t;i++)
d[i]=0;
d[s]=1;q.push(s);
int u,v;
while(!q.empty())
{
u=q.front();
q.pop();
for(int i=fst[u];i;i=nxt[i])
{
v=b[i].to;
if(b[i].cap>0&&!d[v])
{
d[v]=d[u]+1;
q.push(v);
}
}
}
if(d[t])
return true;
return false;
}
int cur[1000005];
int dfs(int u,int a)
{
if(u==t||a==0)  return a;
int &i=cur[u],ans=0;
int v;
for(;i;i=nxt[i])
{
v=b[i].to;
if(b[i].cap>0&&d[v]==d[u]+1)
{
int f=dfs(v,min(a,b[i].cap));
ans+=f;a-=f;
b[i].cap-=f;
b[i^1].cap+=f;
}
if(a==0)    break;
}
return ans;
}
int inf=1e9;
int maxflow()
{
int ans=0;
while(bfs())
{
for(int i=1;i<=t;i++)
cur[i]=fst[i];
ans+=dfs(s,inf);
}
return ans;
}
void read(int &a)
{
a=0;
char c=getchar();
while(c<'0'||c>'9')
c=getchar();
while(c>='0'&&c<='9')
{
a*=10;
a+=c-'0';
c=getchar();
}
}
int main()
{
int n,m;
scanf("%d%d",&n,&m);
s=1;t=n*m;
int w,x;
for(int i=1;i<=n;i++)
for(int j=1;j<m;j++)
{
read(w);x=(i-1)*m+j;
insert(x,x+1,w);
}
int tot=0;
for(int i=1;i<n;i++)
for(int j=1;j<=m;j++)
{
read(w);tot++;
insert(tot,tot+m,w);
}
for(int i=1;i<n;i++)
for(int j=1;j<m;j++)
{
read(w);x=(i-1)*m+j;
insert(x,x+m+1,w);
}
printf("%d",maxflow());
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: