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 }