bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权。

然后从刚才加的s->t分割出来的两面对应的两个点跑最短路,求出来的就是s到t的最小割。

要特判n==0||m==0的情况

然后我特判的那个点就T了一万次,在抄elijahqi巨佬的代码的时候才发现:

我是这样写的:

...
#define MIN(x,y) (x<y?x:y)
...

....ans=MIN(ans,read())
....

这能不T就有鬼了吧

 

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<algorithm>
 4 #include<vector>
 5 #include<queue>
 6 #include<map>
 7 #include<cmath>
 8 #include<ctime>
 9 #include<set>
10 #define pa pair<int,int>
11 #define lowb(x) ((x)&(-(x)))
12 #define REP(i,n0,n) for(i=n0;i<=n;i++)
13 #define PER(i,n0,n) for(i=n;i>=n0;i--)
14 #define MAX(a,b) ((a>b)?a:b)
15 #define MIN(a,b) ((a<b)?a:b)
16 #define CLR(a,x) memset(a,x,sizeof(a))
17 #define rei register int
18 using namespace std;
19 const int maxn=1010;
20 typedef long long ll;
21 
22 ll rd(){
23     ll x=0;char c=getchar();int neg=1;
24     while(c<'0'||c>'9'){if(c=='-') neg=-1;c=getchar();}
25     while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
26     return x*neg;
27 }
28 
29 struct Edge{
30     int a,b,l,ne;
31 }eg[maxn*maxn*12];
32 int N,M,egh[maxn*maxn*2],ect;
33 int id[maxn][maxn][2],pct;
34 int dis[maxn*maxn*2];bool flag[maxn*maxn*2];
35 priority_queue<pa,vector<pa>,greater<pa> > q;
36 
37 inline void adeg(int a,int b,int l){
38     eg[ect].a=a;eg[ect].b=b;eg[ect].l=l;
39     eg[ect].ne=egh[a];egh[a]=ect++;
40 }
41 inline void adeg2(int a,int b,int c){adeg(a,b,c);adeg(b,a,c);}
42 
43 inline int dijkstra(int S,int E){
44     CLR(dis,127);dis[S]=0;
45     q.push(make_pair(0,S));
46     while(!q.empty()){
47         int p=q.top().second;q.pop();
48         if(p==E) break;
49         if(flag[p]) continue;
50         for(rei i=egh[p];i!=-1;i=eg[i].ne){
51             rei b=eg[i].b;
52             if(dis[b]>dis[p]+eg[i].l){
53                 dis[b]=dis[p]+eg[i].l;
54                 q.push(make_pair(dis[b],b));
55             }
56         }flag[p]=1;
57     }return dis[E];
58 }
59 
60 int main(){
61     //freopen(".in","r",stdin);
62     rei i,j,k;
63     N=rd(),M=rd();
64     
65     if(N==1||M==1){
66         if(N<M) swap(N,M);int ans=0x3f3f3f3f;
67         REP(i,1,N-1) ans=min(ans,(int)rd());printf("%d\n",ans);
68         return 0;
69     }
70     CLR(egh,-1);
71     id[0][0][0]=++pct;id[0][0][1]=++pct;
72     REP(i,1,N-1) REP(j,1,M-1) id[i][j][0]=++pct,id[i][j][1]=++pct;
73     REP(i,1,N){
74         REP(j,1,M-1){
75             if(i==1) adeg2(id[1][j][1],id[0][0][0],rd());
76             else if(i==N) adeg2(id[N-1][j][0],id[0][0][1],rd());
77             else adeg2(id[i-1][j][0],id[i][j][1],rd());
78         }
79     }
80     REP(i,1,N-1){
81         REP(j,1,M){
82             if(j==1) adeg2(id[i][1][0],id[0][0][1],rd());
83             else if(j==M) adeg2(id[i][M-1][1],id[0][0][0],rd());
84             else adeg2(id[i][j-1][1],id[i][j][0],rd());
85         }
86     }
87     REP(i,1,N-1){
88         REP(j,1,M-1){
89             adeg2(id[i][j][0],id[i][j][1],rd());
90         }
91     }
92     printf("%d\n",dijkstra(id[0][0][0],id[0][0][1]));
93 
94     return 0;
95 }

 

posted @ 2018-09-07 13:18  Ressed  阅读(193)  评论(0编辑  收藏  举报