嗯被zory和哈老师联合D来学这个平面图转对偶图。。get√
#include<cstdio> #include<cstring> #include<algorithm> #include<queue> using namespace std; struct node { int x,y,d,next; }a[6100000];int len,last[2100000]; void ins(int x,int y,int dd) { len++; a[len].x=x;a[len].y=y;a[len].d=dd; a[len].next=last[x];last[x]=len; } typedef pair<int,int>P; int d[2100000],st,ed; void dijkstra() { priority_queue< P,vector<P>,greater<P> >q; memset(d,63,sizeof(d));d[st]=0; q.push(P(d[st],st)); while(q.empty()==false) { P t=q.top();q.pop(); int x=t.second; if(t.first>d[x])continue; for(int k=last[x];k;k=a[k].next) { int y=a[k].y; if(d[y]>d[x]+a[k].d) { d[y]=d[x]+a[k].d; q.push(P(d[y],y)); } } } } int n,m; void composition() { int dd,mmin; st=2*(n-1)*(m-1)+1; ed=2*(n-1)*(m-1)+2; for(int i=1;i<=n;i++) for(int j=1;j<m;j++) { scanf("%d",&dd); if(mmin>dd)mmin=dd; if(i==1)ins(j,ed,dd); if(i>1&&i<n) { ins((2*i-2)*(m-1)+j,(2*i-3)*(m-1)+j,dd); ins((2*i-3)*(m-1)+j,(2*i-2)*(m-1)+j,dd); } if(i==n)ins(st,(2*i-3)*(m-1)+j,dd); } for(int i=1;i<n;i++) for(int j=1;j<=m;j++) { scanf("%d",&dd); if(mmin>dd)mmin=dd; if(j==1)ins(st,(2*i-1)*(m-1)+1,dd); if(j>1&&j<m) { ins((2*i-2)*(m-1)+j-1,(2*i-2)*(m-1)+m+j-1,dd); ins((2*i-2)*(m-1)+m+j-1,(2*i-2)*(m-1)+j-1,dd); } if(j==m)ins((2*i-1)*(m-1),ed,dd); } for(int i=1;i<n;i++) for(int j=1;j<m;j++) { scanf("%d",&dd); if(mmin>dd)mmin=dd; ins((2*i-1)*(m-1)+j,(2*i-2)*(m-1)+j,dd); ins((2*i-2)*(m-1)+j,(2*i-1)*(m-1)+j,dd); } if(n==1||m==1)printf("%d ",mmin); } int main() { scanf("%d%d",&n,&m); composition(); if(n!=1&&m!=1) { dijkstra(); printf("%d ",d[ed]); } return 0; }