BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子
Time Limit: 15 Sec Memory Limit: 162 MB
Submit: 19528 Solved: 4818
[Submit][Status][Discuss]
Description
Input
Output
输出一个整数,表示参与伏击的狼的最小数量.
Sample Input
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6
Sample Output
HINT
2015.4.16新加数据一组,可能会卡掉从前可以过的程序。
就是用狼把这个图割开
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N=1e6+,INF=1e9;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,c,s,t;
- struct edge{
- int v,ne,c,f;
- }e[N*];
- int cnt,h[N];
- inline void ins(int u,int v,int c){//printf("ins %d %d %d\n",u,v,c);
- cnt++;
- e[cnt].v=v;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[u];h[u]=cnt;
- cnt++;
- e[cnt].v=u;e[cnt].c=c;e[cnt].f=;e[cnt].ne=h[v];h[v]=cnt;
- }
- inline int id(int i,int j){return (i-)*m+j;}
- int vis[N],d[N],q[N],head,tail;
- inline void lop(int &x){if(x==N)x=;}
- bool bfs(){
- memset(vis,,sizeof(vis));
- memset(d,,sizeof(d));
- head=tail=;
- q[tail++]=s;d[s]=;vis[s]=;
- while(head!=tail){
- int u=q[head++];lop(head);
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v;
- if(!vis[v]&&e[i].c>e[i].f){
- vis[v]=;d[v]=d[u]+;
- q[tail++]=v;lop(tail);
- if(v==t) return true;
- }
- }
- }
- return false;
- }
- int cur[N];
- int dfs(int u,int a){
- if(u==t||a==) return a;
- int flow=,f;
- for(int &i=cur[u];i;i=e[i].ne){
- int v=e[i].v;
- if(d[v]==d[u]+&&(f=dfs(v,min(a,e[i].c-e[i].f)))>){
- flow+=f;
- e[i].f+=f;
- e[((i-)^)+].f-=f;
- a-=f;
- if(a==) break;
- }
- }
- return flow;
- }
- int dinic(){
- int flow=;
- while(bfs()){
- for(int i=s;i<=t;i++) cur[i]=h[i];
- flow+=dfs(s,INF);//printf("dinic %d\n",flow);
- }
- return flow;
- }
- int main(){
- n=read();m=read();s=id(,);t=n*m;
- for(int i=;i<=n;i++)
- for(int j=;j<=m-;j++){c=read();ins(id(i,j),id(i,j+),c);}
- for(int i=;i<=n-;i++)
- for(int j=;j<=m;j++) {c=read();ins(id(i,j),id(i+,j),c);}
- for(int i=;i<=n-;i++)
- for(int j=;j<=m-;j++){c=read();ins(id(i,j),id(i+,j+),c);}
- int ans=dinic();
- printf("%d",ans);
- }
浅析最大最小定理在信息学竞赛中的应用
对于平面图,对偶图的最短路就是原图的最小割
直接想也容易理解,最短路就是把一些边割了
想的时候可以加一条s*到t*的INF的边把s*和t*面割开,但是程序不要加,否则暴增3000ms
1116ms,dinic用了1684ms
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- using namespace std;
- const int N=2e6+,INF=1e9;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,c,s,t;
- struct edge{
- int v,ne,w;
- }e[N*];
- int h[N],cnt=;
- inline void ins(int u,int v,int w){//printf("ins %d %d %d\n",u,v,w);
- cnt++;
- e[cnt].v=v;e[cnt].w=w;e[cnt].ne=h[u];h[u]=cnt;
- cnt++;
- e[cnt].v=u;e[cnt].w=w;e[cnt].ne=h[v];h[v]=cnt;
- }
- inline void lop(int &x){if(x==N) x=;else if(x==) x=N-;}
- int d[N],q[N],head,tail;bool inq[N];
- int spfa(){
- memset(d,,sizeof(d));
- head=tail=;
- q[tail++]=s;inq[s]=;d[s]=;
- while(head!=tail){
- int u=q[head++];inq[u]=;lop(head);
- for(int i=h[u];i;i=e[i].ne){
- int v=e[i].v,w=e[i].w;
- if(d[v]>d[u]+w){
- d[v]=d[u]+w;
- if(!inq[v]){
- if(d[v]<d[q[head]]) head--,lop(head),q[head]=v;
- else q[tail++]=v,lop(tail);
- inq[v]=;
- }
- }
- }
- }
- return d[t];
- }
- int main(){
- n=read();m=read();
- int col=*(m-),row=n-;
- s=;t=col*row+;//ins(s,t,INF);
- for(int i=;i<=n;i++)
- for(int j=;j<=m-;j++){
- c=read();
- if(i==) ins(t,(j<<),c);
- else if(i==n) ins((i-)*col+(j<<)-,s,c);
- else ins((i-)*col+(j<<)-,(i-)*col+(j<<),c);
- }
- for(int i=;i<=n-;i++)
- for(int j=;j<=m;j++){
- c=read();
- if(j==) ins(s,(i-)*col+,c);
- else if(j==m) ins((i-)*col+(j<<)-,t,c);
- else ins((i-)*col+(j<<)-,(i-)*col+(j<<)-,c);
- }
- for(int i=;i<=n-;i++)
- for(int j=;j<=m-;j++){
- c=read();
- ins((i-)*col+(j<<)-,(i-)*col+(j<<),c);
- }
- int ans=spfa();
- printf("%d",ans);
- }
BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]的更多相关文章
- BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)
浅析最大最小定理在信息学竞赛中的应用---周东 ↑方法介绍 对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e; 然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对 ...
- bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...
- BZOJ 1001: [BeiJing2006]狼抓兔子 最小割
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓 ...
随机推荐
- EF架构~EF异步改造之路~仓储接口的改造
回到目录 返回异步与并行目录 C#5.0带来了并行编程 {C#1.0托管代码→C#2.0泛型→C#3.0LINQ→C#4.0动态语言→C#5.0异步编程} 随着C#5.0在.net4.5出来之后,它们 ...
- SpringMVC中servletFileUpload.parseRequest(request)解析为空获取不到数据问题
原因分析 首先我们来看下Spring mvc 中文件上传的配置 <bean id="multipartResolver" class="org.springfram ...
- python之消息队列
引言 你是否遇到过两个(多个)系统间需要通过定时任务来同步某些数据?你是否在为异构系统的不同进程间相互调用.通讯的问题而苦恼.挣扎?如果是,那么恭喜你,消息服务让你可以很轻松地解决这些问题.消息服务擅 ...
- Spring声明事务管理
首先我们先了解事务,什么是事务? 简单来说就是要么全部成功,要么什么都不做. 为什么要使用事务? 比如说常用银行系统的例子,如果没有用事务,有人在存入钱的时候出了问题,那么银行系统数据库的数据没有改变 ...
- js鼠标滚轮滚动图片切换效果
效果体验网址:http://keleyi.com/keleyi/phtml/image/12.htm HTML文件代码: <!DOCTYPE html PUBLIC "-//W3C// ...
- HTML5学习笔记一 简单学习HTML5
什么是HTML? HTML 是用来描述网页的一种语言. HTML 指的是超文本标记语言: HyperText Markup Language HTML 不是一种编程语言,而是一种标记语言 标记语言是一 ...
- Android 学习心得 页面跳转,不显示新页面信息
原因: 1.新页面的Activity中,public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceSt ...
- openfire安装
服务器第一次能够开启,但不久就断开,再连接就会闪退,命令行更改Java路径后即可 http://www.jianshu.com/p/5d88fe201c71 开启服务器后,导入数据库脚本,创建几个测试 ...
- Android中Listview点击item不变颜色以及设置listselector 无效
Android中Listview点击item不变颜色以及设置listselector 无效 这是同一个问题,Listview中点击item是会变颜色的,因为listview设置了默认的listsele ...
- Android5.0 TimePicker,DatePicker恢复成低版本滚动模式
新版中的TimePicker DatePicker是不支持使用遥控器的, 恢复成低版本滚动模式只需要是xml文件加上一句即可: android:datePickerMode="spinner ...