#include<iostream> #include<cstdio> #include<algorithm> using namespace std; #define INF 1000000000 #define M 2100030 int n,m,s,t,x,tot,ans; int dis[M],head[M],q[M]; bool vis[M]; struct edge{int v,dist,nxt;}e[4*M]; void add(int x,int y,int z){ e[++tot].v=y; e[tot].dist=z; e[tot].nxt=head[x]; head[x]=tot; e[++tot].v=x; e[tot].dist=z; e[tot].nxt=head[y]; head[y]=tot; } void spfa(int s,int t){ for (int i=0;i<=t;i++) dis[i]=INF; int tt=0,ww=1; q[1]=s; dis[s]=0; vis[s]=1; while (tt!=ww){ tt=tt%M+1; int v=q[tt]; vis[v]=0; for (int i=head[v];i;i=e[i].nxt) if (dis[e[i].v]>dis[v]+e[i].dist){ dis[e[i].v]=dis[v]+e[i].dist; if (!vis[e[i].v]){vis[e[i].v]=1; ww=ww%M+1; q[ww]=e[i].v;} } } } int main(){ scanf("%d%d",&n,&m); if (n==1){ ans=INF; for (int i=1;i<m;i++){scanf("%d",&x); ans=min(ans,x);} printf("%d\n",ans); return 0; } if (m==1){ ans=INF; for (int i=1;i<n;i++){scanf("%d",&x); ans=min(ans,x);} printf("%d\n",ans); return 0; } s=n*m*2+1; t=s+1; for (int i=1;i<m;i++){ scanf("%d",&x); add(i,t,x); } for (int i=2;i<n;i++) for (int j=1;j<m;j++){ scanf("%d",&x); add((i*2-2)*(m-1)+j,(i*2-3)*(m-1)+j,x); } for (int i=1;i<m;i++){ scanf("%d",&x); add(s,(n*2-3)*(m-1)+i,x); } for (int i=1;i<n;i++){ scanf("%d",&x); add(s,(i*2-1)*(m-1)+1,x); for (int j=2;j<m;j++){ scanf("%d",&x); add((i*2-2)*(m-1)+j-1,(i*2-1)*(m-1)+j,x); } scanf("%d",&x); add((i*2-2)*(m-1)+m-1,t,x); } for (int i=1;i<n;i++) for (int j=1;j<m;j++){ scanf("%d",&x); add((i*2-1)*(m-1)+j,(i*2-2)*(m-1)+j,x); } spfa(s,t); printf("%d\n",dis[t]); return 0; }
|