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

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

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

但是这题的点数高达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. Axure 部件的交互样式

    选中的 时  需要设置事件

  2. Java中的小知识。

    package jicheng; public class Animal { //定义一个成员变量name. private String name; public String getName() ...

  3. PHP curl_reset函数

    curl_reset— 重置libcurl会话句柄的所有选项. 说明 void curl_reset ( resource $ch ) 该函数将重新初始化cURL的所有选项值(默认值). 注意:cur ...

  4. Cisco基础(一):Vlan的划分、配置trunk中继链路、以太通道配置、DHCP服务配置

    一.Vlan的划分 目标: VLAN(虚拟局域网)是对连接到的第二层交换机端口的网络用户的逻辑分段,不受网络用户的物理位置限制而根据用户需求进行网络分段.一个VLAN可以在 一个交换机或者跨交换机实现 ...

  5. 为什么NULL能多次free

    void __cdecl _free_base (void * pBlock) {           int retval = 0;             if (pBlock == NULL) ...

  6. 框架-.NET:ASP.NET Core

    ylbtech-框架-.NET:ASP.NET Core ASP.NET Core是一个免费且开放源代码的Web框架,以及由微软和社区开发的下一代ASP.NET.它是一个模块化框架,既可以Window ...

  7. MySQL高级学习笔记(三):Mysql逻辑架构介绍、mysql存储引擎

    文章目录 Mysql逻辑架构介绍 总体概览 总体概览 mysql存储引擎 查看命令 看你的 mysql 现在已提供什么存储引擎 : 看你的 mysql 当前默认的存储引擎 : 各个引擎简介 MyISA ...

  8. ORACLE切非归档模式:

    C:\Documents and Settings\Administrator>sqlplus /nologSQL> conn / as sysdbaConnected to an idl ...

  9. 力扣算法——139WordBreak【M】

    Given a non-empty string s and a dictionary wordDict containing a list of non-empty words, determine ...

  10. 去BAT面试完的Mysql面试题总结(55道,带完整答案)

    1.一张表里面有ID自增主键,当insert了17条记录之后,删除了第15,16,17条记录,再把mysql重启,再insert一条记录,这条记录的ID是18还是15 ? 2.mysql的技术特点是什 ...