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][ ...
随机推荐
- qt qml中PropertyAnimation的几种使用方法
qml文章 qt qml中PropertyAnimation的几种使用方法 动画应用场景有以下几种: 首先如果一个Rectangle.动画是要改变它的x和y值 1,Rectangle一旦被创建,就要移 ...
- 《转》python 网络编程
原地址:http://blog.163.com/benben_long/blog/static/19945824320121225918434/ 网络客户端: 1. 理解socket: socket是 ...
- Pods was rejected as an implicit dependency for 'libPods.a' because its architectures 'x86_64' didn
引入cocoaPods后.第一次编译,或者运行update后 可能报这个错误: Pods was rejected as an implicit dependency for 'libPods.a' ...
- 浅谈 Python 程序和 C 程序的整合
源地址:http://www.ibm.com/developerworks/cn/linux/l-cn-pythonandc/ 概览 Python 是一种用于快速开发软件的编程语言,它的语法比较简单, ...
- 实现自己的http server - loop_in_codes - C++博客
实现自己的http server - loop_in_codes - C++博客 实现自己的http server Write your own http server author : Kevin ...
- PreparedStatement与Statement
转载自:http://www.importnew.com/5006.html PreparedStatement是用来运行SQL查询语句的API之中的一个,Java提供了 Statement.Prep ...
- ubuntu/linux mint 创建proc文件的三种方法(四)
在做内核驱动开发的时候,能够使用/proc下的文件,获取对应的信息,以便调试. 大多数/proc下的文件是仅仅读的,但为了演示样例的完整性,都提供了写方法. 方法一:使用create_proc_ent ...
- UVA 10828 - Back to Kernighan-Ritchie(概率+高斯消元)
UVA 10828 - Back to Kernighan-Ritchie 题目链接 题意:给图一个流程图,有结点的流程,每次进入下一个流程概率是均等的,有q次询问,求出每次询问结点的运行期望 思路: ...
- Activity数据传输到服务
activity数据接口负责启动该服务包.service获取数据.手术. 详细demo如下面: package com.example.android_service_trance; import a ...
- Flexigrid的使用(整合Struts2)
Flexigrid是一个jQuery表格插件 下载地址:http://download.csdn.net/detail/itmyhome/7613879 用法: 一.相关资源文件的引入 <lin ...