我满心以为本题正解为最短路,结果到处都是最大流……

几乎所有的都写了什么“对偶图”跑最短路,但我真的不知道什么叫做对偶图
-------------------------------------------------------------------------------------------------
介绍一下本题的最短路算法叭。并不算难。主要是感性理解。

首先很容易观察出这是一个最小割,那么就是求最大流了。

但是这题的点数高达10e6,按常理来说最大流应该稳稳地TLE。但是没有T好气哦

那么想办法!

首先最小割在本题时可以这样感性理解:上图是一个你同学在钢铁厂打出来的一个铁架子。你把start处用手捏起来,end处自然垂下。用一个剪刀钳把这个铁架子拦腰剪成两半。

如果剪成好几瓣(掉下来有好几个联通块的),那么显而易见,不如剪成两半(把刚才几个剪断的地方原样拼起来变成两个联通块)。

我们把三角形看成是点,黑色的边看成是连接三角形的边,那么剪成两半的意思是……在三角形点的图上找一条从左下到右上的最短路径!沿着这条路径剪开就行了。

但是这题的点数高达10e6,按常理来说SPFA应该稳稳地TLE。但是没有T好气哦

那就堆优化dijkstra。

这个加边超烦的。但思路清晰的话就没什么问题。记得在左下空白处设一个源点,右上角设一个汇点。源点连接所有邻接它的左边的、下边的三角形点,汇点连接所有邻接它的右边的、上边的三角形点。

#include <cstdio>
#include <queue>
using namespace std;
const int N=,S=N*N*+,inf=(<<)-;
int n,m,a[N][N],b[N][N],c[N][N],d[S],id[N][N],ss,tt,h[S],v[S],nx[S],w[S],eg=;
bool vis[S]={};
struct info
{
int x,w;
}data;
inline bool operator<(const info &a,const info &b)
{
return a.w>b.w;
}
priority_queue<struct info> pq;
inline void egadd(int uu,int vv,int ww)
{
nx[++eg]=h[uu];h[uu]=eg;
v[eg]=vv;w[eg]=ww;
}
void rd(int &s)
{
s=;char c=getchar();
while (c<) c=getchar();
while (c>=) s=(s<<)+(s<<)+(c^),c=getchar();
}
int main()
{
scanf("%d%d",&n,&m);
for (int i=;i<=n;i++)
for (int j=;j<=m-;j++)
rd(a[i][j]);
for (int i=;i<=n-;i++)
for (int j=;j<=m;j++)
rd(b[i][j]);
for (int i=;i<=n-;i++)
for (int j=;j<=m-;j++)
rd(c[i][j]);
n--;m--;
if (!n)
{
int res=inf;
for (int i=;i<=m;i++)
if (a[][i]<res)
res=a[][i];
printf("%d",res);
return ;
}
if (!m)
{
int res=inf;
for (int i=;i<=n;i++)
if (b[i][]<res)
res=b[i][];
printf("%d",res);
return ;
}
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
id[i][j]=(i-)**m+j;
ss=n**m+;tt=ss+;
for (int i=;i<=n;i++)
for (int j=;j<=m;j++)
{
egadd(id[i][j],id[i][j]+m,c[i][j]);
egadd(id[i][j]+m,id[i][j],c[i][j]);
}
for (int i=;i<=n;i++)
for (int j=;j<=m-;j++)
{
egadd(id[i][j],id[i][j+]+m,b[i][j+]);
egadd(id[i][j+]+m,id[i][j],b[i][j+]);
}
for (int i=;i<=n-;i++)
for (int j=;j<=m;j++)
{
egadd(id[i][j]+m,id[i+][j],a[i+][j]);
egadd(id[i+][j],id[i][j]+m,a[i+][j]);
}
for (int i=;i<=m;i++)
{
egadd(id[][i],tt,a[][i]);
egadd(ss,id[n][i]+m,a[n+][i]);
}
for (int i=;i<=n;i++)
{
egadd(ss,id[i][]+m,b[i][]);
egadd(id[i][m],tt,b[i][m+]);
}
for (int i=;i<=tt;i++)
d[i]=inf;
d[ss]=;
pq.push((info){ss,});
while (!pq.empty())
{
while (!pq.empty() && vis[pq.top().x])
pq.pop();
if (pq.empty()) break;
data=pq.top();
pq.pop();
int x=data.x,ww=data.w;
printf("%d %d\n",x,ww);
vis[x]=true;
for (int i=h[x];i;i=nx[i])
if (!vis[v[i]] && d[v[i]]>ww+w[i])
{
d[v[i]]=ww+w[i];
pq.push((info){v[i],d[v[i]]});
printf("Add:%d %d\n",v[i],d[v[i]]);
}
}
printf("%d",d[tt]);
return ;
}

bzoj1001 [ICPC-Beijing 2006]狼抓兔子的更多相关文章

  1. P4001 [ICPC-Beijing 2006]狼抓兔子

    题目地址:P4001 [ICPC-Beijing 2006]狼抓兔子 平面图 边与边只在顶点相交的图. 对偶图 对于一个平面图,都有其对应的对偶图. 平面图被划分出的每一个区域当作对偶图的一个点: 平 ...

  2. 2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割)

    2021.12.02 P4001 [ICPC-Beijing 2006]狼抓兔子(最小割) https://www.luogu.com.cn/problem/P4001 题意: 把图分成两部分需要的最 ...

  3. 洛谷 P4001 [ICPC-Beijing 2006]狼抓兔子

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

  4. BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路

    问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...

  5. 解题:BJOI 2006 狼抓兔子

    题面 可以看出来是最小割,然后你就去求最大流了 这么大的范围就是让你用网络流卡的?咋想的啊=.=??? 建议还是老老实实用 平面图最小割等于其对偶图最短路 这个东西来做吧,虽然这个东西跑的也挺慢的,最 ...

  6. ICPC-Beijing 2006 狼抓兔子

    题目描述 题解: 裸的最小割. 但是最大流跑不过去怎么办? 转变一下,既然最大流是一条左下<->右上的通路,我们可以把图划分为若干区域, 最后找左下到右上的最短路就行了. 代码: #inc ...

  7. [BZOJ 2006] 狼抓兔子

    [题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=1001 [算法] 最小割 [代码] #include<bits/stdc++.h ...

  8. 【洛谷4001】 [ICPC-Beijing 2006]狼抓兔子(最小割)

    传送门 洛谷 Solution 直接跑最小割板子就好了. 代码实现 #include<stdio.h> #include<stdlib.h> #include<strin ...

  9. 洛谷$P4001\ [ICPC-Beijing 2006]$狼抓兔子 网络流+对偶图

    正解:网络流+对偶图 解题报告: 传送门! $umm$日常看不懂题系列了$kk$.其实就是说,给定一个$n\cdot n$的网格图,求最小割$QwQ$ 然后网格图的话显然是个平面图,又看到数据范围$n ...

随机推荐

  1. 【NOIP2019模拟11.01】Game(贪心+线段树)

    Description: ​ 小 A 和小 B 在玩一个游戏,他们两个人每人有

  2. Python--模块之re

    re模块 就其本质而言,正则表达式(或 RE)是一种小型的.高度专业化的编程语言,(在Python中)它内嵌在Python中,并通过 re 模块实现.正则表达式模式被编译成一系列的字节码,然后由用 C ...

  3. 树莓派上安装boost库

    一.安装boost库 sudo apt-get install libboost-dev aptitude search boost 二.编写测试代码 #include <iostream> ...

  4. linux IPC socket(3)server简单写法

    写server的一些流程总结 一.向内核申请一个socket TCP形式 sock_fd = socket(AF_INET, SOCK_STREAM, ); UDP形式 sfd = socket(AF ...

  5. WebView中shouldOverrideUrlLoading和onPageStarted方法的区别

    WebView中的shouldOverrideUrlLoading和onPageStarted这两个方法就是可以捕获到跳转的url,然后进行一系列的操作,但是他们两到底有什么区别呢? 当点击页面中的链 ...

  6. 前端每日实战:80# 视频演示如何用纯 CSS 创作一个自行车车轮

    效果预览 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/XBXEPK 可交互视频 此视频是可 ...

  7. IDEA @Override is not allowed when implementing interface method(转载)

    近期研究idea,在编码过程发现报错:@Override is not allowed when implementing interface method .找到一个老外的回答,感觉挺有用的,记录下 ...

  8. Redis入门很简单之二【常见操作命令】

    Redis入门很简单之二[常见操作命令] 博客分类: NoSQL/Redis/MongoDB redisnosql缓存  Redis提供了丰富的命令,允许我们连接客户端对其进行直接操作.这里简单介绍一 ...

  9. thinkphp5一键清除缓存

    入口文件定义缓存文件路径常量 define('DS', DIRECTORY_SEPARATOR); defined('APP_PATH') or define('APP_PATH', dirname( ...

  10. 15. Django连接Mysql数据库

    安装PyMySQL,打开cmd, pip install PyMySQL 在.../blog/init.py 目录下添加: import pymysql pymysql.install_as_MySQ ...