HDOJ3035平面图最小割转最短路
2012-08-21 17:24
260 查看
百万数量级的点呀好吓人~
此题两种解法:
(1)最大流,但明显点太多,肯定超时,不过明知道超时我也写了一遍~然后坐等TLE~
(2)最短路,刚开始不知道还可以这么转化,搜了一下平面图最小割,看到下图后顿悟(虽然不知道原图干嘛的~),立马写最短路了,我个傻B一最短路就写spfa,一最短路就写spfa,也不分析分析~又TLE之后就又写了dijkstra了,2秒多过的。
![](http://my.csdn.net/uploads/201208/21/1345541401_7853.jpg)
还有这题建图有点麻烦~
以下为AC代码:
此题两种解法:
(1)最大流,但明显点太多,肯定超时,不过明知道超时我也写了一遍~然后坐等TLE~
(2)最短路,刚开始不知道还可以这么转化,搜了一下平面图最小割,看到下图后顿悟(虽然不知道原图干嘛的~),立马写最短路了,我个傻B一最短路就写spfa,一最短路就写spfa,也不分析分析~又TLE之后就又写了dijkstra了,2秒多过的。
![](http://my.csdn.net/uploads/201208/21/1345541401_7853.jpg)
还有这题建图有点麻烦~
以下为AC代码:
#include <cstdio> #include <queue> #include <cstring> #include <iostream> using namespace std; const int NN=1000100; const int MM=7000000; const int INF=0x3fffffff; struct node{ int v,d; node() {} node(int _v,int _d): v(_v),d(_d) {} bool operator <(const node a)const { return a.d<d; } }; int n,m,en,S,T,head[NN]; struct Edge{ int v,w,next; Edge() {} Edge(int _v,int _w,int _next): v(_v),w(_w),next(_next) {} } e[MM]; inline void add(int u,int v,int w) { //printf("%d %d : %d\n",u,v,w); e[en].v=v; e[en].w=w; e[en].next=head[u]; head[u]=en++; e[en].v=u; e[en].w=w; e[en].next=head[v]; head[v]=en++; } void init_and_build() { int i,j,x,y,z; en=S=0; T=n*m*4+1; for (i=S; i<=T; i++) head[i]=-1; for (j=0; j<m; j++) { x=j*4+1; scanf("%d",&z); add(S,x,z); } for (i=1; i<n; i++) for (j=0; j<m; j++) { y=(i*m+j)*4+1; x=y-m*4+3; scanf("%d",&z); add(x,y,z); } for (j=0; j<m; j++) { x=((n-1)*m+j)*4+4; scanf("%d",&z); add(x,T,z); } for (i=0; i<n; i++) { scanf("%d",&z); add(i*m*4+2,T,z); for (j=1; j<m; j++) { y=(i*m+j)*4+2; x=y-3; scanf("%d",&z); add(x,y,z); } scanf("%d",&z); add(S,(i+1)*m*4-1,z); } for (i=0; i<n; i++) { for (j=0; j<m; j++) { x=(i*m+j)*4+1; scanf("%d",&z); add(x,x+1,z); scanf("%d",&z); add(x,x+2,z); } for (j=0; j<m; j++) { x=(i*m+j)*4+4; scanf("%d",&z); add(x,x-2,z); scanf("%d",&z); add(x,x-1,z); } } } int dis[NN]; bool vis[NN]={0}; void dij() { int i,u,v; for (i=S; i<=T; i++) { dis[i]=INF; vis[i]=0; } dis[S]=0; priority_queue<node> q; q.push(node(S,0)); while (!q.empty()) { u=q.top().v; q.pop(); if (u==T) break; if (vis[u]) continue; vis[u]=true; for (i=head[u]; i!=-1; i=e[i].next) { v=e[i].v; if (!vis[v] && dis[v]>dis[u]+e[i].w) { dis[v]=dis[u]+e[i].w; q.push(node(v,dis[v])); } } } printf("%d\n",dis[T]); } int main() { while (~scanf("%d%d",&n,&m)) { init_and_build(); dij(); } return 0; }
相关文章推荐
- HDU 3035 War 平面图最小割转化为最短路
- hdu 3035 War(平面图最小割)
- 狼抓兔子 BZOJ1001 平面图最小割转对偶图最短路
- BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】
- 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)
- BZOJ1001 [BeiJing2006]狼抓兔子(平面图最小割转最短路)
- 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)
- [BZOJ2007]NOI2010海拔|最小割|平面图转对偶图|最短路
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
- bzoj 1001 平面图转对偶图 最短路求图最小割
- 【BZOJ1001】狼抓兔子,平面图转对偶图(从最小割到最短路)
- HDOJ 5294 Tricks Device 最短路(记录路径)+最小割
- BZOJ 2007 NOI 2010 海拔 平面图最小割->最短路SPFA+pq
- 【BZOJ-2007】海拔 最小割 (平面图转对偶图 + 最短路)
- BZOJ 2007 海拔(平面图最小割-最短路)
- 【BZOJ1001】狼抓兔子(平面图最小割转最短路)
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
- 【平面图】【最小割】【最短路】【Heap-Dijkstra】bzoj1001 [BeiJing2006]狼抓兔子
- UVALive 3661 Animal Run(平面图最小割,边为节点+最短路)
- hdoj 5294 Tricks Device 【最短路+ 最小割】