HDU 3035 War 平面图最小割转化为最短路
2014-03-18 18:14
337 查看
还是参考周冬的论文 浅析最大—最小定理在信息学竞赛中的应用
就是建图麻烦点,还有卡SPFA。。。得用优先队列优化的dijkstra
还要学习下dijkstra的堆优化啊= =
就是建图麻烦点,还有卡SPFA。。。得用优先队列优化的dijkstra
#include <cstdlib> #include <cctype> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <string> #include <iostream> #include <sstream> #include <map> #include <set> #include <queue> #include <stack> #include <fstream> #include <numeric> #include <iomanip> #include <bitset> #include <list> #include <stdexcept> #include <functional> #include <utility> #include <ctime> using namespace std; #define PB push_back #define MP make_pair #define REP(i,n) for(int i=0;i<(n);++i) #define FOR(i,l,h) for(int i=(l);i<=(h);++i) #define DWN(i,h,l) for(int i=(h);i>=(l);--i) #define CLR(vis) memset(vis,0,sizeof(vis)) #define MST(vis,pos) memset(vis,pos,sizeof(vis)) #define MAX3(a,b,c) max(a,max(b,c)) #define MAX4(a,b,c,d) max(max(a,b),max(c,d)) #define MIN3(a,b,c) min(a,min(b,c)) #define MIN4(a,b,c,d) min(min(a,b),min(c,d)) #define PI acos(-1.0) #define INF 1000000000 #define LINF 1000000000000000000LL #define eps 1e-8 typedef long long LL; const int maxn=1e6+6; int n,m; int s,t; struct node{ int w,to,next; }a[maxn*4]; int dis[maxn],head[maxn],vis[maxn]; int edge; class Dot { public:LL dis;int v; Dot(){} Dot(int _v,LL _d) { v=_v;dis=_d; } bool operator<(const Dot&x)const { return dis>x.dis; } }; void init() { MST(head,-1); edge=0; } void addedge(int u,int v,int d) { a[edge].to=v; a[edge].w=d; a[edge].next=head[u]; head[u]=edge++; } priority_queue<Dot>Q; void dijkstra(int s) { int u,v;Dot uu; FOR(i,0,t)dis[i]=INF,vis[i]=0; Q.push(Dot(s,0));dis[s]=0; while(!Q.empty()) { uu=Q.top();Q.pop();u=uu.v; if(vis[u])continue;vis[u]=1; for(int i=head[u];~i;i=a[i].next) { v=a[i].to; if(!vis[v]&&dis[v]>dis[u]+a[i].w) { dis[v]=dis[u]+a[i].w; Q.push(Dot(v,dis[v])); } } } } int main() { int a,b,c; while(~scanf("%d%d",&n,&m)) { s=0,t=n*m*4+1; init(); FOR(i,0,n) REP(j,m) { scanf("%d",&c); if(i==0) { a=t,b=j*4+2; } else { if(i==n) { a=(i-1)*m*4+j*4+4,b=s; } else { a=i*m*4+j*4+2;b=(i-1)*m*4+j*4+4; } } addedge(a,b,c),addedge(b,a,c); } REP(i,n) FOR(j,0,m) { scanf("%d",&c); if(j==0) { a=s,b=i*m*4+j*4+1; } else { if(j==m) { a=t,b=i*4*m+(j-1)*4+3; } else { a=i*m*4+(j-1)*4+3;b=i*m*4+j*4+1; } } addedge(a,b,c),addedge(b,a,c); } REP(i,n) REP(k,2) REP(j,m) FOR(l,1,2) { scanf("%d",&c); if(k==0) { a=i*m*4+j*4+l,b=a+1; } else { if(l==1) { a=i*m*4+j*4+1,b=i*m*4+j*4+4; } else { a=i*m*4+j*4+3,b=i*m*4+j*4+4; } } addedge(a,b,c),addedge(b,a,c); } dijkstra(s); cout<<dis[t]<<endl; } return 0; }
还要学习下dijkstra的堆优化啊= =
相关文章推荐
- 【HDU】3035 War 对偶图最小割——最短路
- hdu 3035 War(平面图最小割)
- HDU 3035 War 平面最小割+优先队列优化的dij
- 平面图中最小割向最短路的转化
- HDU 3035 War (对偶图转最短路)
- HDOJ3035平面图最小割转最短路
- HDU 3035 War(对偶图求最小割)
- hdu 3870(平面图最小割转最短路)
- HDU 5889 Barricade(最短路+最小割)
- hdu 3870 Catch the Theves 最小割-》求最短路
- 【BZOJ1001】狼抓兔子(BJOI2006)-平面图最小割转最短路
- HDU - 3870 Catch the Theves(最小割+对偶图==最短路)
- 【BZOJ1001】狼抓兔子,平面图转对偶图(从最小割到最短路)
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
- HDU 3599 War 求最短路+最大流
- HDU - 1385 Minimum Transport Cost (最短路dijkstra+打印字典序最小路径)
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
- hdu 5889----最短路+最小割
- HDU 2680 【多源单汇 + 反向建图最短路转化】
- HDU 4370 0 or 1(最短路+最小环判断)