[POJ1001]狼抓兔子 做题笔记
2016-04-06 17:17
381 查看
·· / ·– ·· ·-·· ·-·· / ·–· · ·-· ··· ·· ··· - / ··- -· - ·· ·-·· / ·· / ·– ·· -·
题目来源:http://www.lydsy.com/JudgeOnline/problem.php?id=1001
这题是最大流,也可以用spfa过,虽然我并不会。。
注意一下这题的边是无向边,边要正反存两遍,算上网络流原有的反向边相当于存了4遍。。空间差几兆就要MLE了。。。
黄学长那里有一种比较奇怪的存法,看不太明白。
题目来源:http://www.lydsy.com/JudgeOnline/problem.php?id=1001
这题是最大流,也可以用spfa过,虽然我并不会。。
注意一下这题的边是无向边,边要正反存两遍,算上网络流原有的反向边相当于存了4遍。。空间差几兆就要MLE了。。。
黄学长那里有一种比较奇怪的存法,看不太明白。
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int N=1000009,M=6000009,inf=0x3fffffff; int n,m,s,t,cnt=0,tot=1,maxflow=0; int pos[1002][1002]; int d ,q ,l,r; int head ,ver[M<<1],nxt[M<<1],e[M<<1]; void add (int u,int v,int w) { ver[++tot]=v;e[tot]=w;nxt[tot]=head[u];head[u]=tot; ver[++tot]=u;e[tot]=0;nxt[tot]=head[v];head[v]=tot; } bool bfs () { l=0;r=0; for (int i=0;i<=n*m+5;i++) d[i]=0; q[r++]=s; d[s]=1; while (l<r) { int x=q[l++]; for (int i=head[x];i;i=nxt[i]) if (e[i]&&!d[ver[i]]) { q[r++]=ver[i]; d[ver[i]]=d[x]+1; } } if (d[t]) return 1; return 0; } int dinic (int x,int f) { int rest=f; if (x==t) return f; for (int i=head[x];i&&rest;i=nxt[i]) if (e[i]&&d[ver[i]]==d[x]+1) { int now=dinic(ver[i],min(e[i],rest)); if (!now) d[ver[i]]=0; e[i]-=now; e[i^1]+=now; rest-=now; } return f-rest; } int main () { int w,tmp; scanf("%d%d",&n,&m); for (int i=1;i<=n;i++) for (int j=1;j<=m;j++) pos[i][j]=++cnt; s=1,t=cnt;//直接用(1,1)作源,用(n,m)作汇就行了 for (int i=1;i<=n;i++) for (int j=1;j<=m-1;j++) { scanf("%d",&w); add(pos[i][j],pos[i][j+1],w); add(pos[i][j+1],pos[i][j],w); } for (int i=1;i<=n-1;i++) for (int j=1;j<=m;j++) { scanf("%d",&w); add(pos[i][j],pos[i+1][j],w); add(pos[i+1][j],pos[i][j],w); } for (int i=1;i<=n-1;i++) for (int j=1;j<=m-1;j++) { scanf("%d",&w); add(pos[i][j],pos[i+1][j+1],w); add(pos[i+1][j+1],pos[i][j],w); } while (bfs()) while (tmp=dinic(s,inf)) maxflow+=tmp; printf("%d",maxflow); return 0; }
相关文章推荐
- 求最大公约数的几种方法
- servlet学习笔记
- 算法练习-NOJ-1041-最长公共子序列
- ueditor 和 umeditor 粘贴过滤问题
- Spring集成log4j日志管理
- 简单的封装log
- 【图片处理工具】谷歌专业图像处理插件「Nik Collection」
- js 日期工具类
- ios之TableViewCell重用机制避免重复显示问题
- 通过adb shell在移动终端上抓包分析
- oracle,把A表在B表没有的字段数据插入到B中
- android完全退出应用的4种方法
- 文字溢出部分自动滚动显示
- Servlet的配置
- 什么是AJAX?
- LintCode-最大子数组
- 最大连通子数组求和
- hdu 4123 树形dp+rmq
- Log4J日志配置详解
- 团队加分作业