bzoj 2007: [Noi2010]海拔(最短路)
2017-07-04 21:25
316 查看
题目描述
传送门
题解
首先图中只需要0/1两种高度,并且如果按照高度分类,可以把图分成两个连通块,与左上角在同一连通块的全部为0。那么其实我们就是要求一个最小割,将图分成两部分。
但是这道题如果直接跑最小割太慢了,所以我们利用平面图转对偶图,然后直接求最短路即可。
有向图转对偶图,其实就是将每条有向边逆时针旋转90度。
代码
#include<iostream> #include<cstdio> #include<cstring> #include<algorithm> #include<cmath> #include<queue> #define N 3000003 #define inf 1000000000 using namespace std; int tot,n,point ,v ,c ,nxt ,dis ,can ; void add(int x,int y,int z) { tot++; nxt[tot]=point[x]; point[x]=tot; v[tot]=y; c[tot]=z; // cout<<x<<" "<<y<<" "<<z<<endl; } int spfa(int s,int t) { for (int i=1;i<=t;i++) dis[i]=inf; dis[s]=0; queue<int> p; p.push(s); can[s]=1; while (!p.empty()){ int now=p.front(); p.pop(); for (int i=point[now];i;i=nxt[i]) if (dis[v[i]]>dis[now]+c[i]){ dis[v[i]]=dis[now]+c[i]; if (!can[v[i]]) { can[v[i]]=1; p.push(v[i]); } } can[now]=0; } return dis[t]; } int main() { freopen("a.in","r",stdin); // freopen("my.out","w",stdout); scanf("%d",&n); int S=n*n+1; int T=n*n+2; for (int i=1;i<=n+1;i++) for (int j=1;j<=n;j++) { int t=(i-1)*n+j; int x; scanf("%d",&x); if (i==1) add(t,T,x); else if (i==n+1) add(S,t-n,x); else add(t,t-n,x); } for (int i=1;i<=n;i++) for (int j=1;j<=n+1;j++) { int t=(i-1)*n+j; int x; scanf("%d",&x); if (j==1) add(S,t,x); else if (j==n+1) add(t-1,T,x); else add(t-1,t,x); } for (int i=1;i<=n+1;i++) for (int j=1;j<=n;j++) { int t=(i-1)*n+j; int x; scanf("%d",&x); if (i==1) add(T,t,x); else if (i==n+1) add(t-n,S,x); else add(t-n,t,x); } for (int i=1;i<=n;i++) for (int j=1;j<=n+1;j++){ int t=(i-1)*n+j; int x; scanf("%d",&x); if (j==1) add(t,S,x); else if (j==n+1) add(T,t-1,x); else add(t,t-1,x); } printf("%d\n",spfa(S,T)); }
相关文章推荐
- BZOJ.2007.[NOI2010]海拔(最小割 对偶图最短路)
- [BZOJ2007][NOI2010]海拔(对偶图最短路)
- [BZOJ2007]NOI2010海拔|最小割|平面图转对偶图|最短路
- 【bzoj2007】[Noi2010]海拔 最小割+对偶图+最短路
- BZOJ 2007 NOI 2010 海拔 平面图最小割->最短路SPFA+pq
- 【BZOJ2007】[Noi2010]海拔 对偶图最短路
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
- 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)
- 【BZOJ2007】【NOI2010】海拔(最小割,平面图转对偶图,最短路)
- bzoj2007 [Noi2010]海拔(平面图最小割转对偶图最短路)
- [BZOJ2007] [NOI2010] 海拔|网络流80‘|最短路100’
- 【BZOJ2007】【Noi2010】海拔 平面图最小割转最短路
- BZOJ 2007 NOI2010 海拔 平面图最小割
- 【BZOJ 2007】 2007: [Noi2010]海拔 (平面图转对偶图+spfa)
- bzoj 2007: [Noi2010]海拔
- BZOJ2007: [Noi2010]海拔
- BZOJ 2007: [Noi2010]海拔
- BZOJ 2007: [Noi2010]海拔
- [bzoj2007][Noi2010]海拔
- [BZOJ 2007][NOI 2010]海拔(平面图最小割)