BZOJ原题链接

洛谷原题链接

显然就是求最小割。

而对于一个平面图有结论,最大流=最小割=对偶图最短路。

所以这题可用最大流或是转换为对偶图求最短路,这里我是用的对偶图。

虽然理论上按上界算,这题\(Dinic\)应该是跑不过去的,不过因为网络流复杂度玄学,\(Dinic\)莫名跑得挺快的。

在转换对偶图的时候,注意\(n = 1\)或\(m = 1\)的情况。

#include<cstdio>
#include<cstring>
#include<queue>
using namespace std;
const int N = 2e6 + 10;
const int M = 7e6 + 10;
struct po {
int x, d;
bool operator < (const po &b) const
{
return d > b.d;
}
};
po X;
int fi[N], di[M], ne[M], da[M], dis[N], l, st, ed, n, m;
bool v[N];
priority_queue<po>q;
inline int re()
{
int x = 0;
char c = getchar();
bool p = 0;
for (; c < '0' || c > '9'; c = getchar())
p |= c == '-';
for (; c >= '0' && c <= '9'; c = getchar())
x = x * 10 + c - '0';
return p ? -x : x;
}
inline void add(int x, int y, int z)
{
di[++l] = y;
da[l] = z;
ne[l] = fi[x];
fi[x] = l;
di[++l] = x;
da[l] = z;
ne[l] = fi[y];
fi[y] = l;
}
inline int ch(int x, int y, int L)
{
int k = ((x - 1) * (m - 1) + y) << 1;
return L ? k - 1 : k;
}
inline void add_row(int x, int y, int z)
{
if (!(x ^ 1))
add(ch(x, y, 0), ed, z);
else
if (!(x ^ n))
add(st, ch(x - 1, y, 1), z);
else
add(ch(x - 1, y, 1), ch(x, y, 0), z);
}
inline void add_col(int x, int y, int z)
{
if (!(y ^ 1))
add(st, ch(x, y, 1), z);
else
if (!(y ^ m))
add(ch(x, y - 1, 0), ed, z);
else
add(ch(x, y - 1, 0), ch(x, y, 1), z);
}
inline void add_opl(int x, int y, int z)
{
add(ch(x, y, 1), ch(x, y, 0), z);
}
int main()
{
int i, j, x, y;
n = re();
m = re();
st = (n - 1) * (m - 1) << 1 | 1;
ed = st + 1;
if (!(n ^ 1) || !(m ^ 1))
{
for (i = 1; i <= n; i++)
for (j = 1; j < m; j++)
add(st, ed, re());
for (i = 1; i < n; i++)
for (j = 1; j <= m; j++)
add(st, ed, re());
for (i = 1; i < n; i++)
for (j = 1; j < m; j++)
add(st, ed, re());
}
else
{
for (i = 1; i <= n; i++)
for (j = 1; j < m; j++)
add_row(i, j, re());
for (i = 1; i < n; i++)
for (j = 1; j <= m; j++)
add_col(i, j, re());
for (i = 1; i < n; i++)
for (j = 1; j < m; j++)
add_opl(i, j, re());
}
memset(dis, 60, sizeof(dis));
X.d = dis[X.x = st] = 0;
q.push(X);
while (!q.empty())
{
x = q.top().x;
q.pop();
if (v[x])
continue;
v[x] = 1;
for (i = fi[x]; i; i = ne[i])
if (dis[X.x = y = di[i]] > dis[x] + da[i])
{
X.d = dis[y] = dis[x] + da[i];
q.push(X);
}
}
printf("%d", dis[ed]);
return 0;
}

BZOJ1001或洛谷4001 [BJOI2006]狼抓兔子的更多相关文章

  1. BZOJ1001 洛谷4001 [BJOI2006]狼抓兔子 题解

    题目 这个题目有多种解法,这个题也是一个比较经典的题了,正是因为他的多样的做法,这个题主要难在建图和优化,因为这是一个网格图,所以spfa肯定过不去,所以用最短路解法的话,只能用dij,而网络流也是要 ...

  2. [洛谷P4001][BJOI2006]狼抓兔子

    题目大意:给你一个n*m的网格图,有三种边,横的,纵的和斜的,要你求出它的最小割 题解:网络流 卡点:1.无向图,反向弧容量应和正向弧相同 C++ Code: #include<cstdio&g ...

  3. 洛谷P4001 [BJOI2006]狼抓兔子(平面图转对偶图)

    传送门 明明只要最小割加点优化就能过的东西…… 然而我偏偏要去学平面图转对偶图结果发现课件关键地方看不清->这里 而且建图累的半死…… 说实话只要最大流建图的时候反向边直接设为当前边容量再加个当 ...

  4. Luogu 4001 [BJOI2006]狼抓兔子

    BZOJ 1001…… 并不会这个trick,所以笔记要详细一点. 前置知识 : 平面图转对偶图    传送门 听说直接$Dinic$就好了,还跑得比正解快…… 首先我们按照平面图的定义,把网格图中所 ...

  5. P4001 [BJOI2006]狼抓兔子(对偶图)

    P4001 [BJOI2006]狼抓兔子 最短路+对偶图 看这题最容易想到的就是网络流.Dinic可以过,据说还跑得比正解快. 如果不写网络流,那么需要知道2个前置知识:平面图和对偶图(右转baidu ...

  6. BJOI2006狼抓兔子

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 9967  Solved: 2267[Submit][S ...

  7. BZOJ1001 BJOI2006 狼抓兔子

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

  8. 752. [BJOI2006] 狼抓兔子

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

  9. [BJOI2006]狼抓兔子

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

随机推荐

  1. java-学习2

    第一节 Java语言介绍 1.Java的起源 Oak-->Java      交互式操作智能家居 2.Java的发展 Java1.0 Java1.2    JavaSE  :Java平台标准版  ...

  2. 服务器安装pip

    1. wget --no-check-certificate https://pypi.python.org/packages/source/s/setuptools/setuptools-19.6. ...

  3. CentOS7下解决yum install mysql-server没有可用包

    # wget http://repo.mysql.com/mysql-community-release-el7-5.noarch.rpm --  http://repo.mysql.com/mysq ...

  4. Animator状态快速切换问题

    [Animator状态快速切换问题] 事情是这样的,我尝试在一帧内多次切换一些状态(当前状态为Idle的情况下): public Animator animator; void OnEnable() ...

  5. google翻译插件安装

    来源:http://www.cnplugins.com/tools/how-to-setup-crx.html 1. 下载: 2.拖拽: 3.下一步安装 4.完成.

  6. hibernate mysql视图操作

    hibernate对视图操作,首先建立数据库视图 视图v_invite: create view pintu.v_invite asselect cp.user_id as be_user_id,ca ...

  7. 每月IT摘录201901

    技术 1.Jsessionid只是tomcat的对sessionid的叫法,其实就是sessionid:在其它的容器也许就不叫jsessionid了. 2.在 InnoDB 中,索引使用的数据结构是 ...

  8. 上海高校金马五校赛 F题:1 + 2 = 3?

    链接:https://www.nowcoder.com/acm/contest/91/F来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 131072K,其他语言26214 ...

  9. selector 选择器

    布局文件中: <ImageView android:id="@+id/image_message" android:layout_width="40dp" ...

  10. WdatePicker控件中日期的范围选择

    1.开始日期不能大于结束日期,结束日期只能选择今天之前(不包括今天) <asp:TextBox ID="T_CREATION_DATE_Start" Width=" ...