题意:

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

思路:

      如果大意的可能直接上来一遍最大流,然后就会各种悲剧的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. 京东 Vue3 组件库闪亮登场

    京东零售开源项目 NutUI 是一套京东风格的轻量级移动端 Vue 组件库,是开发和服务于移动 Web 界面的企业级产品.经过长时间的开发与打磨,NutUI 3.0 终于要和大家见面了!3.0 版本在 ...

  2. SSM整合再回顾

    一.spring 前言:提起spring就不得不说到它的IOC和AOP的概念.IOC就是一个对象容器,程序员可以将对象的创建交给spring的IOC容器来创建,不再使用传统的new对象方式,从而极大程 ...

  3. POJ-3268(来回最短路+dijkstra算法)

    Silver Cow Party POJ-3268 这题也是最短路的模板题,只不过需要进行两次求解最短路,因为涉及到来回的最短路之和. 该题的求解关键是:求解B-A的最短路时,可以看做A是起点,这就和 ...

  4. Nodejs学习笔记(4) 文件操作 fs 及 express 上传

    目录 参考资料 1. fs 模块 1.1 读取文件fs.readFile 1.2 写入文件fs.writeFile 1.3 获取文件信息fs.stat 1.4 删除文件fs.unlink 1.5 读取 ...

  5. c/c++ switch case内括号

    如果在case语句中有定义变量,则必须要加{},否则会报错.

  6. 5、Spring教程之依赖注入

    概念 依赖注入(Dependency Injection,DI). 依赖 : 指Bean对象的创建依赖于容器 . Bean对象的依赖资源 . 注入 : 指Bean对象所依赖的资源 , 由容器来设置和装 ...

  7. 力扣 - 剑指 Offer 37. 序列化二叉树

    目录 题目 思路 代码 复杂度分析 题目 剑指 Offer 37. 序列化二叉树 思路 序列化其实就是层序遍历 但是,要能反序列化的话,前.中.后.层序遍历是不够的,必须在序列化时候保存所有信息,这样 ...

  8. DB性能瓶颈分析思路

    在性能分析过程中,经常遇到性能瓶颈出现在SQL的情况,此类问题通常可以分为两大类场景,一是SQL自身性能差导致的慢,如索引缺失.索引失效.统计信息不准确.SQL过于复杂等:二是由于外部原因等待导致的S ...

  9. linux日志文件说明

    /var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一 /var/log/secure 与安全相关的日志信息 /var/log/maillog 与 ...

  10. crx 文件安装 如何安装 Chrome插件

          Chrome 67 版本(大概2018.06.06的更新包)开始,插件已经无法离线安装啦,也就是自己无法使用crx文件安装插件,   而只能从chrome.google.com/webst ...