1 #include<cstdio> 2 #include<iostream> 3 #include<queue> 4 #include<cstring> 5 #define pa pair<int,int> 6 #define M 250005 7 using namespace std; 8 int S,T,cnt=1,ans,head[M],next[10*M],u[10*M],v[10*M],d[M],f[M],n; 9 int p(int a1,int a2) 10 { 11 if(!a1||a2>n) 12 return T; 13 if(!a2||a1>n) 14 return S; 15 return (a1-1)*n+a2; 16 } 17 void jia(int a1,int a2,int a3) 18 { 19 cnt++; 20 next[cnt]=head[a1]; 21 head[a1]=cnt; 22 u[cnt]=a2; 23 v[cnt]=a3; 24 } 25 int main() 26 { 27 scanf("%d",&n); 28 S=0; 29 T=n*n+1; 30 for(int i=1;i<=n+1;i++) 31 for(int j=1;j<=n;j++) 32 { 33 int a1; 34 scanf("%d",&a1); 35 jia(p(i,j),p(i-1,j),a1); 36 } 37 for(int i=1;i<=n;i++) 38 for(int j=1;j<=n+1;j++) 39 { 40 int a1; 41 scanf("%d",&a1); 42 jia(p(i,j-1),p(i,j),a1); 43 } 44 for(int i=1;i<=n+1;i++) 45 for(int j=1;j<=n;j++) 46 { 47 int a1; 48 scanf("%d",&a1); 49 jia(p(i-1,j),p(i,j),a1); 50 } 51 for(int i=1;i<=n;i++) 52 for(int j=1;j<=n+1;j++) 53 { 54 int a1; 55 scanf("%d",&a1); 56 jia(p(i,j),p(i,j-1),a1); 57 } 58 priority_queue<pa,vector<pa>,greater<pa> >q; 59 memset(d,60,sizeof(d)); 60 q.push(make_pair(0,S)); 61 d[0]=0; 62 for(;!q.empty();) 63 { 64 int p=q.top().second; 65 q.pop(); 66 if(f[p]) 67 continue; 68 f[p]=1; 69 for(int i=head[p];i;i=next[i]) 70 if(d[u[i]]>d[p]+v[i]) 71 { 72 d[u[i]]=d[p]+v[i]; 73 q.push(make_pair(d[u[i]],u[i])); 74 } 75 } 76 printf("%d\n",d[T]); 77 return 0; 78 }
看一看像网络流的最小割,可跑网络流超时,网络流的最小割就等于对偶图的最短路,把图转化为对偶图之后跑最短路就不超时了,可是我的平面图转对偶图还不是太会wuwu。