bzoj1001/BJOI2006 灰太狼抓到的兔子
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 灰太狼抓到的兔子的更多相关文章
- BZOJ1001 BJOI2006 狼抓兔子
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...
- BZOJ1001 BJOI2006狼抓兔子(最小割+最短路)
显然答案就是最小割.直接跑dinic也能过,不过显得不太靠谱. 考虑更正确的做法.作为一个平面图,如果要把他割成两半,那么显然可以用一条曲线覆盖且仅覆盖所有割边.于是我们把空白区域看成点,隔开他们的边 ...
- [bzoj1001][BJOI2006]狼抓兔子——最大流转最短路,平面图
题目描述: 给定一个平面图,求最小割. 题解: 本题是一道经典题. 周冬Orz的论文是很好的研究资料. 这道题点太多,所以直接跑dinic无疑会超时. 我们观察原图,发现原图是一个平面图. 什么是平面 ...
- 【BZOJ1001】狼抓兔子(网络流)
[BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- 752. [BJOI2006] 狼抓兔子
★★★ 输入文件:bjrabbit.in 输出文件:bjrabbit.out 简单对比时间限制:1 s 内存限制:162 MB Description Source: Beijin ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
随机推荐
- c# in depth 之泛型实参的类型推断
调用泛型方法时,指定类型实参常常会显得很多余.为简化工作,c#2编译器被赋予了一定的“智能”,让你在调用方法时,不需要显式声明类型实参. 在深入讨论这个主题之前,必须强调一下:类型推断只适用于泛型方法 ...
- Struts工作机制图+OGNL+EL+值栈(Map,对象栈)
struts 值栈 通过get set方法 方便的获取,设置属性值 比如从jsp页面传来的參数...从Action设置jsp所要回显的内容 注意EL表达式,struts2对request进 ...
- SRM 638 Div2
2333... 因为TC过少的参与者.加上不断fst 我掉了div2该. 幸运的是完成的背div1该.. 250 水的问题 500 水的问题.. 直接bfs扩展即可了 注意判重. 我还用康托展开了真 ...
- HDU4685 Prince and Princess 完美搭配+良好的沟通
意甲冠军:今天,有n王子,m公主.现在给他们配对,与王子会嫁给一个男人,他喜欢.公主无法做出选择. 这标题去咬硬,还有一类似的题目poj1904.那个题目也是给王子与公主配对,但那个是王子公主各n个, ...
- 初步C++运算符重载学习笔记<3> 增量递减运算符重载
初步C++运算符重载学习笔记<1> 初探C++运算符重载学习笔记<2> 重载为友元函数 增量.减量运算符++(--)分别有两种形式:前自增++i(自减--i).后自增i ...
- iOS_UIButton 简单操作
UIButton 风格 typedef NS_ENUM(NSInteger, UIButtonType) { UIButtonTypeCustom = 0, // no button type UIB ...
- Java利用httpasyncclient进行异步HTTP请求
Java利用httpasyncclient进行异步HTTP请求 前段时间有个需求在springmvc mapping的url跳转前完成一个统计的业务.显然需要进行异步的处理,不然出错或者异常会影响到后 ...
- unity中的MonoBehaviour.OnMouseDown()
在官网的api文档中仅说明了 Description OnMouseDown is called when the user has pressed the mouse button while ov ...
- [Sqlite] 移动嵌入式数据库Sqlite日报SQL操作语句汇总
,EXPLAIN分析 没有建立索引之前.分析都是表扫描: sqlite> EXPLAIN SELECT * FROM COMPANY WHERE Salary < 20000; add ...
- 牛逼的验证码,printf返回值
牛逼的验证码,如下图, 结果是4321,为什么呢,主要是printf返回值问题?那么printf到底返回什么? 经查阅,printf的返回值是打印的字符个数,因此结果是4321就很明显了.