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。

posted on 2016-03-18 22:34  xiyuedong  阅读(189)  评论(0编辑  收藏  举报