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][ ...
随机推荐
- HDU1452Happy 2004(高次幂取模+积性函数+逆元)
题目意思:2004^x的所有正因数的和(S)对29求余:输出结果: 原题链接 题目解析:解析参照来源:点击打开链接 因子和 6的因子是1,2,3,6; 6的因子和是s(6)=1+2+3+6=12; 2 ...
- 随机IP代理
第一个例子就设置了一个代理IP,也是不靠谱的,最好的方式就是多设置几个,如第二个例子,通过http://www.youdaili.net/Daili/你可以找到很多代理IP, 抓取国内网站时尽量选取中 ...
- 在iPhoneApp中加载PDF
原文: http://ios.biomsoft.com/2012/02/17/load-a-pdf-file-in-the-iphone-app-smoothly/ 本节将学习如何从服务器加载 pdf ...
- 它们的定义Adapterg在etView( )正在使用View.setTag()与不同的是不使用。
首先看使用Tag案件. @Override public View getView(int position, View view, ViewGroup group) { ViewHolder hol ...
- Java Thread.join()详解(转)
(1)join方法是可以中断的(2)在线程joiner在另一个线程t上调用t.join(),线程joiner将被挂起,直到线程t结束(即t.isAlive()返回为false)才恢复 package ...
- 利用json获取天气信息
天气预报信息获取是利用json获取的,网上有非常多资源,源码.因为上面涉及到非常多天气信息,包含湿度,出行建议等,以及加入了全部城市代码的资源包.为了练手了解json的原理.我仅获取诚笃城市的最高温, ...
- 【MongoDB】The description of index(一)
From this blog, we start to talk about the index in mongo Database, which is similar to the traditio ...
- 查看mysql数据库表大小和最后修改时间
查看mysql数据库表相关信息如表大小.修改更新等信息,可以通过以下方式: 一 show table status like ’table_name‘ ; 二 在infortmation_sche ...
- Cocos2dx 3.x创建Layer的步骤
创建 1.新建类文件.注意文件夹为Classes下.否则文件不能正常找到. 2.改动预编译头.如用VS,默觉得#pragma once,为了兼容,改为#ifndef | #define | #endi ...
- poj3268(最短路)
题目连接:http://poj.org/problem?id=3268 题意:给出n个点和m条单向边,现在所有牛要到牛x那里去参加聚会,并且所有牛参加聚会后还要回来,给你牛x,除了牛x之外的牛,他们都 ...