hdu3035 最小割转换成最短路
题意:
给你一个平面图,要求从求出从左上角到右下角的最小割。
思路:
如果大意的可能直接上来一遍最大流,然后就会各种悲剧的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 最小割转换成最短路的更多相关文章
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- BZOJ_1001_狼抓兔子_(平面图求最小割+对偶图求最短路)
描述 http://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec ...
- [BZOJ 2007] [Noi2010] 海拔 【平面图最小割(对偶图最短路)】
题目链接:BZOJ - 2007 题目分析 首先,左上角的高度是 0 ,右下角的高度是 1.那么所有点的高度一定要在 0 与 1 之间.然而选取 [0, 1] 的任何一个实数,都可以用整数 0 或 1 ...
- BZOJ 2007 海拔(平面图最小割转对偶图最短路)
首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...
- BZOJ1001/LG4001 「ICPC Beijing2006」狼抓兔子 平面图最小割转对偶图最短路
问题描述 BZOJ1001 LG4001 题解 平面图最小割=对偶图最短路 假设起点和终点间有和其他边都不相交的一条虚边. 如图,平面图的若干条边将一个平面划分为若干个图形,每个图形就是对偶图中的一个 ...
- bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路)
bzoj2007/luoguP2046 海拔(平面图最小割转对偶图最短路) 题目描述: bzoj luogu 题解时间: 首先考虑海拔待定点的$h$都应该是多少 很明显它们都是$0$或$1$,并且所 ...
- [BJOI2006]狼抓兔子——最小割转对偶图最短路
其实这个题直接Dinic跑最小割可过. (小优化是: 无向图建网络流,一条边不用建成4条,可以正反容量都是边权即可.完全等价 ) [无效]网络流之转换对偶图 一个巧妙的事情是,如果建边合适的话,最小割 ...
- bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...
- BZOJ2007 [Noi2010]海拔 【平面图最小割转对偶图最短路】
题目链接 BZOJ2007 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...
随机推荐
- 《C++ Primer》笔记 第2章 变量和基本类型
如果你的数值超过了int表示范围,选用long long 如果你需要使用一个不大的整数,那么明确指定它的类型是signed char或者unsigned char 执行浮点数运算选用double 当一 ...
- javaScript操作cookie出现同名key
引文: 网上查找js操作cookie文章发现百度千篇一律全是同样的代码,使用过程中发现一个bug,设置cookie导致出现多个同名key的cookie,官网cookie文档内未提及,下文将标出问题点, ...
- 如何在Bash脚本中引入alias
更多精彩内容,请关注微信公众号:后端技术小屋 alias的使用 在日常开发中,为了提高运维效率,我们会用alias(命令别名)来定义命令的简称.比如在~/.bash_profile中添加: alias ...
- 树莓派 3/4 安装 FreeBSD
已盼春来归 已盼春来归 今日去 愿为春来归 盼归春天来了 FreeBSD 的春天在哪里? 树莓派是什么,相信凡是关注了我们的人都不会不知道,但是介于非专业人员需要在此做简要介绍.我们的安卓手机,大部分 ...
- Apache配置 8.配置防盗链
(1)介绍 防盗链,通俗讲,就是不让别人盗用你网站上的资源.这个资源,通常指的是图片.视频.歌曲.文档等. (2)配置 配置防盗链先编辑主机配置文件: #vim /usr/local/apache2. ...
- MyEclipse安装过程
1.安装JDK并配置环境变量 下载地址: https://www.oracle.com/technetwork/java/javase/downloads/index.html ①点击download ...
- Java中BO、DAO、DO、DTO、PO、POJO、VO的概念
在程序开发中,经常会碰到各种专业术语,这里统一做一下解释,有遗漏或理解错误的恳请指正. BO(Business Object)业务对象 主要作用是把业务逻辑封装为一个对象,这个对象可以包括一个或多个其 ...
- 「免费开源」基于Vue和Quasar的前端SPA项目crudapi后台管理系统实战之自定义组件(四)
基于Vue和Quasar的前端SPA项目实战之序列号(四) 回顾 通过上一篇文章 基于Vue和Quasar的前端SPA项目实战之布局菜单(三)的介绍,我们已经完成了布局菜单,本文主要介绍序列号功能的实 ...
- [系统重装日志3]autocad和ps破解安装
cad 以前保存的安装包注册机还让杀毒软件给自动删除了!!!(╯‵□′)╯︵┻━┻!!!又在网上找的注册机!!!(╯‵□′)╯︵┻━┻!!!软件安装包必须保存一份压缩的!!!(╯‵□′)╯︵┻━┻!! ...
- 折腾kubernetes各种问题汇总-<1>
折腾kubernetes各种问题汇总-<1> 折腾部署fluend-elasticsearch日志,折腾出一大堆问题,解决这些问题过程中,感觉又了解了不少. 如何删除不一致状态下的rc,d ...