题意:

      给你一个平面图,要求从求出从左上角到右下角的最小割。

思路:

      如果大意的可能直接上来一遍最大流,然后就会各种悲剧的MLE,TLE,其实这个题目可以用到有个论文里面的那个平面图最小割转最短路(hdu3870 也是这种问题),我们证明说着费劲直接给一个图片理解就行了,思路就是这张图片


这个题目用Spfa会超时的,要用优化过的Dij才能过,我不会的优化过的Dij,直接用模板过的。

#include<stdio.h>
#include<string.h>
#include<queue>

using namespace
std; //*************************************************
#include<queue>
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define clr(f,z) memset(f,z,sizeof(f))
#define LL long long
using namespace std; const int mm=1e6+9;
const
LL oo=1e16;
class
Edge
{
public:int
v,next;LL w;
};
class
Dot
{
public:
LL dis;int v;
Dot(){}
Dot(int _v,LL _d)
{

v=_v;dis=_d;
}
bool operator<(const
Dot&x)const
{
return
dis>x.dis;
}
};
class
ShortPath
{
public:
int
head[mm],edge;Edge e[3000000];
void
clear()
{

clr(head,-1);edge=0;
}
void
add(int u,int v,LL w)
{

e[edge].v=v;e[edge].w=w;e[edge].next=head[u];head[u]=edge++;
}
bool
vis[mm];int id[mm];LL dis[mm];
priority_queue<Dot>Q;
LL dijstra(int s,int t,int n)
{
int
u,v;Dot uu;
FOR(i,0,n)dis[i]=oo,vis[i]=0;
Q.push(Dot(s,0));dis[s]=0;
while(!
Q.empty())
{

uu=Q.top();Q.pop();u=uu.v;
if(
vis[u])continue;vis[u]=1;
for(int
i=head[u];~i;i=e[i].next)
{
v=e[i].v;
if(!
vis[v]&&dis[v]>dis[u]+e[i].w)
{

dis[v]=dis[u]+e[i].w;
Q.push(Dot(v,dis[v]));
}
}
}
return
dis[t];
}
}
sf; //sf.clear();
//sf.add();
//sf.dijstra(s ,t ,n);
//********************************
int main ()
{
int
n ,m ,i ,j ,a ,b ,now ,p1 ,p2 ,p3 ,p4;
while(~
scanf("%d %d" ,&n ,&m))
{
int
s = 0 ,t = n * m * 4 + 1;
sf.clear();
for(
i = 1 ;i <= n + 1;i ++)
for(
j = 1 ;j <= m ;j ++)
{

scanf("%d" ,&a);
now = (i - 1) * m + j;
p1 = (now - 1) * 4 + 1;
p2 = (now - 1) * 4 + 2;
p3 = (now - 1) * 4 + 3;
p4 = (now - 1) * 4 + 4; if(i == 1) sf.add(s ,p2 ,a);
else if(
i == n + 1)
{
int
p44 = ((i - 1 - 1) * m + j - 1) * 4 + 4;
sf.add(p44 ,t ,a);
}
else
{
int
noww = now - m;
sf.add(p2 ,(noww - 1) * 4 + 4 ,a);
sf.add((noww - 1) * 4 + 4 ,p2 ,a);
}
} for(
i = 1 ;i <= n ;i ++)
for(
j = 1 ;j <= m + 1 ;j ++)
{

scanf("%d" ,&a);
now = (i - 1) * m + j;
p1 = (now - 1) * 4 + 1;
p2 = (now - 1) * 4 + 2;
p3 = (now - 1) * 4 + 3;
p4 = (now - 1) * 4 + 4;
if(
j == 1) sf.add(p1 ,t ,a);
else if(
j == m + 1)
{
int
p33 = ((i - 1) * m + j - 1 - 1) * 4 + 3;
sf.add(s ,p33 ,a);
}
else
{
int
noww = now - 1;
sf.add(p1 ,(noww - 1) * 4 + 3 ,a);
sf.add((noww - 1) * 4 + 3 ,p1 ,a);
}
} for(
i = 1 ;i <= n * 2 ;i ++)
for(
j = 1 ;j <= m ;j ++)
{

scanf("%d %d" ,&a ,&b);
int
ii = (i + 1) / 2;
now = (ii - 1) * m + j;
p1 = (now - 1) * 4 + 1;
p2 = (now - 1) * 4 + 2;
p3 = (now - 1) * 4 + 3;
p4 = (now - 1) * 4 + 4;
if(
i & 1)
{

sf.add(p1 ,p2 ,a) ,sf.add(p2 ,p1 ,a);
sf.add(p2 ,p3 ,b) ,sf.add(p3 ,p2 ,b);
}
else
{

sf.add(p3 ,p4 ,b) ,sf.add(p4 ,p3 ,b);
sf.add(p4 ,p1 ,a) ,sf.add(p1 ,p4 ,a);
}
}

printf("%d\n" ,sf.dijstra(s ,t ,t));
}
return
0;
}

hdu3035 最小割转换成最短路的更多相关文章

  1. BZOJ 1001 狼抓兔子 (最小割转化成最短路)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 27715  Solved: 7134[Submit][ ...

  2. BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)

    描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec   ...

  3. [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】

    题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...

  4. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

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

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

  6. bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)

    bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj  luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...

  7. [BJOI2006]狼抓兔子——最小割转对偶图最短路

    其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...

  8. bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)

    平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...

  9. BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】

    题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...

随机推荐

  1. Excel技巧—开始菜单之格式刷六大功能

    转: Excel技巧-开始菜单之格式刷六大功能 点赞再看,养成习惯:千里之行,始于足下. 微信搜索[亦心Excel]关注这个不一样的自媒体人. 本文 GitHub https://github.com ...

  2. MySQL之四 存储引擎

    1.介绍 存储引擎MySQL中的"文件系统" MySQL体系结构 InnoDB存储引擎介绍 My1SAM 和InnoDB区别  mysql MariaDB [(none)]> ...

  3. java 集合 + 常见面试题

    1.1. 集合概述 1.1.1. Java 集合概览 从下图可以看出,在 Java 中除了以 Map 结尾的类之外, 其他类都实现了 Collection 接口. 并且,以 Map 结尾的类都实现了 ...

  4. MySQL使用入门--初识数据库

    MySQL使用入门 数据库概述 数据库是存放数据的仓库.在应用的开发中总是离不开数据的查询.处理.存储,例如图书管理系统就需要操纵和存储大量的数据.没有数据库之前我们使用文件存储数据,但是文件存储有很 ...

  5. sprintgboot+springsecurity的跨域问题,

    整个项目是使用前后端分离的形式开发,登录接口部分出现了问题, 重写了security的登录接口,返回json数据 到这一步已经没有没有问题了,使用postman测试,也可以看到接口返回的结果,但是使用 ...

  6. 【LeetCode】10.Regular Expression Matching(dp)

    [题意] 给两个字符串s和p,判断s是否能用p进行匹配. [题解] dp[i][j]表示s的前i个是否能被p的前j个匹配. 首先可以分成3大类情况,我们先从简单的看起: (1)s[i - 1] = p ...

  7. 【MCU】移植AT32库&FreeRTOS教程

    目录 前言 1. 移植AT库 1.1 移植内核相关文件 1.2 移植芯片型号相关文件 1.3 移植芯片外设驱动库 1.4 移植配置文件及中断回调函数文件 2. 移植FreeRTOS源码 2.1 获取 ...

  8. 【LiteOS】LiteOS任务篇-源码分析-创建任务函数

    目录 前言 链接 参考 笔录草稿 部分源码分析 源码分析 LOS_TaskCreate函数 LOS_TaskCreateOnly函数 宏 OS_TCB_FROM_PENDLIST 和 宏 LOS_DL ...

  9. Redis系列-存储篇string主要操作命令

    Redis系列-存储篇string主要操作命令 通过上两篇的介绍,我们的redis服务器基本跑起来.db都具有最基本的CRUD功能,我们沿着这个脉络,开始学习redis丰富的数据结构之旅,当然先从最简 ...

  10. 学习笔记-ionic3 环境配置搭建到打包

    折腾了两周总算理清楚了,参考的链接如下: https://blog.csdn.net/zeternityyt/article/details/79655150  环境配置 https://segmen ...