【BZOJ1001】[BeiJing2006]狼抓兔子

8 篇文章 0 订阅
1 篇文章 0 订阅

想着复习一下Dinic,刚好看到这题不知道为什么之前没有AC。

然后看到了这个:

vfleaking @ 2013-03-26 10:18:14
1#
我初二的时候是自己把这题调出来并A掉的,求不要把初三挂在嘴边当自己调不出程序的囧……年龄不是理由。

%%%%%%%%%%

突然觉得心好累。。。

#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#include<vector>
#define num1 (x1-1)*m+y1
#define num2 (x2-1)*m+y2
using namespace std;
struct edge {
	int to,v;
}e[6000010]; 
vector<int> a[1000010];
int dep[1000010],q[1000010],st,en,cnt,ans,inf,m,n;
void inse(int x,int y,int v){
	e[cnt].to=y;e[cnt].v=v;
	a[x].push_back(cnt++);
}
bool bfs(){
	int u;edge ee;
	memset(dep,0,sizeof(dep));
	int t=0,h=1;q[++t]=st,dep[st]=1;
	while (h<=t){
		u=q[h];h++;
		for (int i=0;i<a[u].size();i++){
			edge ee=e[a[u][i]];
			if (!dep[ee.to]&&(ee.v>0)){
				dep[ee.to]=dep[u]+1;
				q[++t]=ee.to;
			}
		}
	}
	return (dep[en]>0);
}
int dfs(int s,int flow){
	if (s==en) return flow;
	int tmp,usd=0;
	for (int i=0;i<a[s].size();i++){
		int j=a[s][i];
		if (dep[e[j].to]!=dep[s]+1) continue;
		tmp=flow-usd;
		tmp=dfs(e[j].to,min(tmp,e[j].v));
		e[j].v-=tmp;e[j^1].v+=tmp;
		usd+=tmp;
		if (usd==flow) return flow;
	}
	if (!usd) dep[s]=1;
	return usd;
}
void dinic(){
	while (bfs()) ans+=dfs(st,inf);
}
int main(){
	inf=2147483647;
	scanf("%d%d",&n,&m);
	if (n==1&&m==1) {
		printf("0\n");
		return 0;
	}
	st=1;en=n*m;
	int v,x1,x2,y1,y2;
	for (int i=1;i<=n;i++)
	for (int j=1;j<m;j++){
		x1=i;y1=j;x2=i;y2=j+1;
		scanf("%d",&v);
		inse(num1,num2,v);
		inse(num2,num1,v);
	}	
	for (int i=1;i<n;i++)
	for (int j=1;j<=m;j++){
		x1=i;y1=j;x2=i+1;y2=j;
		scanf("%d",&v);
		inse(num1,num2,v);
		inse(num2,num1,v);
	}	
	for (int i=1;i<n;i++)
	for (int j=1;j<m;j++){
		x1=i;y1=j;x2=i+1;y2=j+1;
		scanf("%d",&v);
		inse(num1,num2,v);
		inse(num2,num1,v);
	}	
	dinic();
	printf("%d\n",ans);
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值