1001: [BeiJing2006]狼抓兔子(

id=1001">传送门)

图论新知识。。没学过。。

平面图最小割等于对偶图的最短路

详见课件:http://wenku.baidu.com/view/8f1fde586edb6f1aff001f7d.html

建议下载 直接在百度看可能有重叠  周冬神犇这个课件的演示很清楚。。

动画效果一看就明确了

代码中的建模方式见图:

/**************************************************************
Problem: 1001
User: Lytning
Language: C++
Result: 正确
Time:5212 ms
Memory:161432 kb
****************************************************************/ #include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <algorithm>
#include <queue> using namespace std; const int N=3000000+5,M=8000000+5;
struct edge{int u,v,dis; edge *next;}e[M],*point[N],*P=e;
int used[N],d[N],n,m,S=0,T=1;
queue <int> Qe; inline void add_edge(int a,int b,int dis)
{
//cout<<"edge added : from "<<a<<" to "<<b<<" dis "<<dis<<endl;
edge *Q = ++P; ++P;
P->u = a; P->v = b; P->dis = dis; P->next = point[a]; point[a] = P;
Q->u = b; Q->v = a; Q->dis = dis; Q->next = point[b]; point[b] = Q;
} void SPFA(int s)
{
memset(d,0x7f,sizeof(d));
memset(used,0,sizeof(used));
Qe.push(s);
used[s]=true;
d[s]=0;
while(!Qe.empty())
{
int x = Qe.front();
Qe.pop();
used[x] = false;
for(edge *j = point[x]; j; j = j->next)
{
if(d[x] + j->dis < d[j->v])
{
d[j->v] = d[x] + j->dis;
if(!used[j->v])
{
used[j->v]=true;
Qe.push(j->v);
}
}
}
}
} inline int number(int x,int y,bool up)//每一个方格以左上角坐标表示
{
int ret = ((m-1)*(x-1)+y-1)*2+1;
if(up) ret++;
return ret+1; // S:0 T:1
}
/*
平面数 : (n-1)*(m-1) *2 */
int main()
{
//freopen("bz1001.in","r",stdin);freopen("bz1001.out","w",stdout);
cin>>n>>m;
if(n==1 || m==1)
{
int ans=0;
if(n>m) m=n;
for(int z=1; z<m; z++)
{
if(z==1) cin>>ans;
int t; cin>>t;
if(t<ans) ans =t;
}
cout<<ans<<endl;
}else{
//横向
for(int x=1; x<=n; x++)
{
for(int y=1; y<m; y++)
{
int t; cin>>t;
if(x==1)
add_edge(number(x,y,true),S,t);
else if (x==n)
add_edge(number(x-1,y,false),T,t);
else
add_edge(number(x,y,true),number(x-1,y,false),t);
}
}
//纵向
for(int x=1; x<n; x++)
{
for(int y=1; y<=m; y++)
{
int t; cin>>t;
if(y==1)
add_edge(number(x,y,false),T,t);
else if(y==m)
add_edge(number(x,y-1,true),S,t);
else
add_edge(number(x,y-1,true),number(x,y,false),t);
}
}
//斜
for(int x=1; x<n; x++)
{
for(int y=1; y<m; y++)
{
int t; cin>>t;
add_edge(number(x,y,false),number(x,y,true),t);
}
}
SPFA(S);
cout<<d[T]<<endl;}
}

bzoj1001/BJOI2006 灰太狼抓到的兔子的更多相关文章

  1. BZOJ1001 BJOI2006 狼抓兔子

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  2. BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)

    显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...

  3. [bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图

    题目描述: 给定一个平面图,求最小割. 题解: 本题是一道经典题. 周冬Orz的论文是很好的研究资料. 这道题点太多,所以直接跑dinic无疑会超时. 我们观察原图,发现原图是一个平面图. 什么是平面 ...

  4. 【BZOJ1001】狼抓兔子(网络流)

    [BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...

  5. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

    BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...

  6. BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...

  7. [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图

    狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...

  8. 752. [BJOI2006] 狼抓兔子

    ★★★   输入文件:bjrabbit.in   输出文件:bjrabbit.out   简单对比时间限制:1 s   内存限制:162 MB Description   Source: Beijin ...

  9. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 31805  Solved: 8494[Submit][ ...

随机推荐

  1. HTML中Id和Name的区别

    源地址:http://www.cnblogs.com/laodai/articles/2244215.html 在html中:name指的是用户名称,ID指的是用户注册是系统自动分配给用户的一个序列号 ...

  2. 使用svnkit 的相关实例及相关问题汇总

    SVNKIT操作SVN版本库的完整例子 http://www.cnblogs.com/wangjiyuan/p/svnkitwanchenglizi.html#!comments 2.SVNClien ...

  3. uva 10655 - Contemplation! Algebra(矩阵高速幂)

    题目连接:uva 10655 - Contemplation! Algebra 题目大意:输入非负整数,p.q,n,求an+bn的值,当中a和b满足a+b=p,ab=q,注意a和b不一定是实数. 解题 ...

  4. Swift初窥--使用Swift实现TableView

    完毕Swift的语法关之后.来点实际的Task,第一个任务是写一个tableview,使用cocoaTouch里tableview这个经常使用的控件. 创建project.选择Swift语言 首先是用 ...

  5. 事务不提交,也有可能写redo和数据文件

    事务不提交,也有可能写redo和数据文件

  6. mysql导出和导入数据库

    出口 在dos计划,切换到mysql按照该文件夹bin下一个.输入以下命令 mysqldump -u root -p nxu_life > nxu_life2.sql 运行完毕后,就能够看到在b ...

  7. GOJ1150(矩阵快速幂)

    sum Time Limit: 1000ms Problem Description: 给定a和n,计算a+aa+aaa+aaaa+...+a...a(n个a) 的和. Input: 测试数据有多组, ...

  8. android 图片水平反复平铺(repeat x)

    <=用来反复显示的图 1.最简单方式 创建wave_repeat.xml <?xml version="1.0" encoding="utf-8"? ...

  9. 使用注解实现 bean 转 csv

    csv 文件是 aaa,bbb,ccc aaa,bbb,ccc 保存 这里的要求是 List<T> 线性表的类型 转换成 类别似 html 中 table的格式,即第一行是 head 后面 ...

  10. 服务器编程入门(2)IP协议详解

    问题聚焦:     IP协议是TCP/IP协议族的核心协议,也是socket网络编程的基础之一.这里从两个方面较为深入地探讨IP协议:     1,IP头部信息(指定IP通信的源端IP地址,目的端IP ...