比赛 2025暑期集训第8场 评测结果 AAAAAA
题目名称 狼抓兔子 最终得分 100
用户昵称 wdsjl 运行时间 0.374 s
代码语言 C++ 内存使用 19.26 MiB
提交时间 2025-08-13 08:22:21
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;

const int maxn=1005,maxs=2000005,maxe=6000005;
int n,m,S,T;
int tot,son[maxe],nxt[maxe],lnk[maxs],w[maxe];
void add(int x,int y,int z){
    son[++tot]=y;nxt[tot]=lnk[x];lnk[x]=tot;w[tot]=z;
}

int getid(int x,int y,int op){
	if(x<1||y==m)return S;
	if(y<1||x==n)return T;
	return ((x-1)*m+y)*2+op;
}

int que[maxs],dat[maxs];
bool vis[maxs];

int spfa(){
	memset(dat,63,sizeof(dat));
	memset(vis,0,sizeof(vis));
	int hed=0,til=1;
	que[1]=S;dat[S]=0;
	while(hed!=til){
		int x=que[hed=(hed+1)%maxs];
		vis[x]=0;
		for(int j=lnk[x];j;j=nxt[j])
			if(dat[son[j]]>dat[x]+w[j]){
				dat[son[j]]=dat[x]+w[j];
            	if(!vis[son[j]]){
				    vis[son[j]]=1,
            		que[til=(til+1)%maxs]=son[j];
				}
			}
	}
	return dat[T];
}

int main(){
	freopen("bjrabbit.in","r",stdin);
	freopen("bjrabbit.out","w",stdout); 
	scanf("%d%d",&n,&m);
	S=0;
	T=1;
	for(int i=1;i<=n;i++){
		for(int j=1;j<m;j++){
			int x=getid(i-1,j,1),y=getid(i,j,0),z;
			scanf("%d",&z);
        	add(x,y,z);add(y,x,z);
		}
	}
	for(int i=1;i<n;i++){
		for(int j=1;j<=m;j++){
			int x=getid(i,j-1,0),y=getid(i,j,1),z;
			scanf("%d",&z);
        	add(x,y,z);add(y,x,z);
		}
	}
	for(int i=1;i<n;i++){
		for(int j=1;j<m;j++){
			int x=getid(i,j,0),y=getid(i,j,1),z;
			scanf("%d",&z);
        	add(x,y,z);add(y,x,z);
		}
	}
	printf("%d",spfa());
	return 0; 
}