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 题解 这是裸题啊,,要是考试真的遇到就好了 明显是最小割,而且是有来回两个方向 那么原图所有向右的边转为对偶图向下的边 向左的边转为向上 向下转为向左 向上转为向右 然后跑 ...
随机推荐
- Elastic App Search 快速构建 ES 应用
公号:码农充电站pro 主页:https://codeshellme.github.io App Search 是 Elastic 家族中的一个产品,它可以帮助我们(基于 ES)快速高效的构建搜索应用 ...
- 剑指 Offer 42. 连续子数组的最大和 + 动态规划
剑指 Offer 42. 连续子数组的最大和 题目链接 状态定义: 设动态规划列表 \(dp\) ,\(dp[i]\) 代表以元素 \(4nums[i]\) 为结尾的连续子数组最大和. 为何定义最大和 ...
- shell脚本,mysql数据库的备份-2[mysqldump]
# 数据库IPIP=127.0.0.1# 数据库端口PORT=3306# 数据库用户USER=root# 数据库密码PASSWORD=****# 要备份的数据库TARGET_DB=database_n ...
- Apache配置 8.配置防盗链
(1)介绍 防盗链,通俗讲,就是不让别人盗用你网站上的资源.这个资源,通常指的是图片.视频.歌曲.文档等. (2)配置 配置防盗链先编辑主机配置文件: #vim /usr/local/apache2. ...
- C语言数组寻址
C语言数组 数组的定义 数组是用来存放数据类型相同且逻辑意义相同的数据 数组的大小 数组的大小不能是变量,必须是常量或者常量表达式,常量表达式由编译器编译时自动求值. 也可以不指定数组大小,但必须对数 ...
- 菜刀jsp小马
逛google收获小马一枚,收藏一下 <%@page import="java.io.*,java.util.*,java.net.*,java.sql.*,java.text.*&q ...
- [源码解析] 并行分布式框架 Celery 之架构 (2)
[源码解析] 并行分布式框架 Celery 之架构 (2) 目录 [源码解析] 并行分布式框架 Celery 之架构 (2) 0x00 摘要 0x01 上文回顾 0x02 worker的思考 2.1 ...
- Spring Boot MVC 单张图片和多张图片上传 和通用文件下载
@Autowired private ServerConfig serverConfig; /** * 通用下载请求 * * @param fileName 文件名称 * @param delete ...
- 基于react hooks,zarm组件库配置开发h5表单页面
最近使用React Hooks结合zarm组件库,基于js对象配置方式开发了大量的h5表单页面.大家都知道h5表单功能无非就是表单数据的收集,验证,提交,回显编辑,通常排列方式也是自上向下一行一列的方 ...
- PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642
PAT (Advanced Level) Practice 1023 Have Fun with Numbers (20 分) 凌宸1642 题目描述: Notice that the number ...