记录编号 254762 评测结果 AAAAAA
题目名称 [BJOI2006] 狼抓兔子 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 0.315 s
提交时间 2016-04-25 19:05:49 内存使用 158.68 MiB
显示代码纯文本
/*****************************************************
平面图最小割转化为对偶图最短路,spfa裸上
注意内存!
*****************************************************/
#include<stdio.h>
#include<string.h>
inline void in(int &x){for(x=getchar();x<48||x>57;x=getchar());x^=48;for(int tmp=getchar();47<tmp&&tmp<58;tmp=getchar())x=(x<<1)+(x<<3)+(tmp^48);}
int n,m,w,shu,cnt,id[1010][1010],first[2000010];
struct edge{int v,w,nx;}o[6000010];
inline void add(int u,int v,int w){
	o[++shu].v=v,o[shu].w=w,o[shu].nx=first[u],first[u]=shu;
	o[++shu].v=u,o[shu].w=w,o[shu].nx=first[v],first[v]=shu;
}
bool flag[2000010];
int l,r,x,q[18000010],d[2000010];
void spfa(){
	memset(d,0x3f,sizeof(d)),d[0]=0;
	while(l<=r){
		x=q[l++],flag[x]=0;
		for(int i=first[x];i;i=o[i].nx)
			if(d[o[i].v]>d[x]+o[i].w){
				d[o[i].v]=d[x]+o[i].w;
				if(!flag[o[i].v])flag[o[i].v]=1,q[++r]=o[i].v;
			}
	}
}
int main(){
	freopen("bjrabbit.in","r",stdin);
	freopen("bjrabbit.out","w",stdout);
	in(n),in(m);
	if(n==1||m==1){
		if(n>m)n^=m,m^=n,n^=m;
		int ans=0x3fffffff;
		for(int i=1,w;i<m;++i)
		    in(w),ans=ans>w?w:ans;
		return printf("%d\n",ans==0x3fffffff?0:ans),0;
	}
	for(int i=1;i<n;++i)
	    for(int j=1;j<m;++j)
	        cnt+=2,id[i][j]=cnt;
	for(int i=1,w;i<=n;++i)
	    for(int j=1;j<m;++j){
			in(w);
			if(i==1)add(id[i][j]|1,1,w);
			else if(i==n)add(0,id[i-1][j],w);
			else add(id[i][j]|1,id[i-1][j],w);
	    }
	for(int i=1,w;i<n;++i)
	    for(int j=1;j<=m;++j){
			in(w);
			if(j==1)add(0,id[i][j],w);
			else if(j==m)add(id[i][j-1]|1,1,w);
			else add(id[i][j-1]|1,id[i][j],w);
	    }
	for(int i=1,w;i<n;++i)
	    for(int j=1;j<m;++j)
			in(w),add(id[i][j],id[i][j]|1,w);
	spfa();
	printf("%d",d[1]);
	//while(1);
}