bzoj1001: [BeiJing2006]狼抓兔子
2017-02-15 21:33
405 查看
传送门
最小割转最短路。
将原图中每一个由路径围成的最小三角形区域缩点,相邻区域建一条长度为相邻边权值的边,附加原点S和汇点T。即为对偶图。每个平面图都对应一个对偶图,对偶图中的最小环就是原图的最小割,如果删去对偶图中s-t这条边,就是相当于求最短路了!如下图,蓝色的是原图,红色的是对偶图,绿色的是对偶图最短路(最小环删去了s-t的边)(也是原图最小割)。
把原图中每个点在对偶图中标号,重新建图,在新图中跑最短路就行了,效率比网络流快。程序按照下图建图。
最小割转最短路。
将原图中每一个由路径围成的最小三角形区域缩点,相邻区域建一条长度为相邻边权值的边,附加原点S和汇点T。即为对偶图。每个平面图都对应一个对偶图,对偶图中的最小环就是原图的最小割,如果删去对偶图中s-t这条边,就是相当于求最短路了!如下图,蓝色的是原图,红色的是对偶图,绿色的是对偶图最短路(最小环删去了s-t的边)(也是原图最小割)。
把原图中每个点在对偶图中标号,重新建图,在新图中跑最短路就行了,效率比网络流快。程序按照下图建图。
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<iostream> #include<algorithm> #define N 1998000 #define id(x,y,z) ((x-1)*(n-1)*(m-1)+(y-1)*(m-1)+z) using namespace std; struct edge{int to,next,v;}e[N*3]; int head ,dis ,vis ,q ; int n,m,S,T,x,y,h,t,tot; void add(int x,int y,int z){ e[++tot]=(edge){y,head[x],z}; head[x]=tot; e[++tot]=(edge){x,head[y],z}; head[y]=tot; } inline int read(){ int x=0; char ch=getchar(); for (;ch<48||ch>57;ch=getchar()); for (;ch>=48&&ch<=57;ch=getchar()) x=x*10-48+ch; return x; } int main(){ n=read(); m=read(); S=2*(n-1)*(m-1)+1; T=S+1; for (int i=1;i<=n;i++) for (int j=1;j<m;j++){ x=(i==1)?S:id(1,i-1,j); y=(i==n)?T:id(2,i,j); add(x,y,read()); } for (int i=1;i<n;i++) for (int j=1;j<=m;j++){ x=(j==1)?T:id(2,i,j-1); y=(j==m)?S:id(1,i,j); add(x,y,read()); } for (int i=1;i<n;i++) for (int j=1;j<m;j++) add(id(2,i,j),id(1,i,j),read()); h=0; t=1; memset(dis,100,sizeof(dis)); q[1]=S; dis[S]=0; vis[S]=1; while (h!=t){ h=(h+1)%N; x=q[h]; vis[x]=0; for (int i=head[x];i;i=e[i].next) if (dis[e[i].to]>dis[x]+e[i].v){ dis[e[i].to]=dis[x]+e[i].v; if (!vis[e[i].to]){ vis[e[i].to]=1; t=(t+1)%N; q[t]=e[i].to; } } } printf("%d",dis[T]); }
相关文章推荐
- BZOJ1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006] 狼抓兔子
- BZOJ1001: [BeiJing2006]狼抓兔子
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
- 平面圖最小割 BZOJ1001: [BeiJing2006]狼抓兔子 BZOJ 2007: [Noi2010]海拔
- bzoj 1001: [BeiJing2006]狼抓兔子
- [BZOJ 1001][BeiJing2006]狼抓兔子(网络流/SPFA)
- 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子(s-t平面图+最短路求最小割)
- BZOJ 1001 Beijing 2006 狼抓兔子 最小割
- BZOJ1001 [BeiJing2006]狼抓兔子
- bzoj 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001 [BeiJing2006]狼抓兔子
- 【最小割+对偶图=最短路】BZOJ1001 [BeiJing2006]狼抓兔子
- BZOJ1001 [Beijing2006] 狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
- bzoj1001: [BeiJing2006]狼抓兔子(网络流模板题:最大流)
- bzoj 1001: [BeiJing2006]狼抓兔子 最短路+对偶图