BZOJ 1001 狼抓兔子 平面图的最小割
题目链接:
https://www.lydsy.com/JudgeOnline/problem.php?id=1001
题目大意:
见链接
思路:
求最小割,平面图的最小割等价于对偶图的最短路
直接建图求最短路即可,只是图比较难建。
#include<bits/stdc++.h>
#define IOS ios::sync_with_stdio(false);//不可再使用scanf printf
#define Max(a, b) ((a) > (b) ? (a) : (b))//禁用于函数,会超时
#define Min(a, b) ((a) < (b) ? (a) : (b))
#define Mem(a) memset(a, 0, sizeof(a))
#define Dis(x, y, x1, y1) ((x - x1) * (x - x1) + (y - y1) * (y - y1))
#define MID(l, r) ((l) + ((r) - (l)) / 2)
#define lson ((o)<<1)
#define rson ((o)<<1|1)
#pragma comment(linker, "/STACK:102400000,102400000")//栈外挂
using namespace std;
inline int read()
{
int x=,f=;char ch=getchar();
while (ch<''||ch>''){if (ch=='-') f=-;ch=getchar();}
while (ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} typedef long long ll;
const int maxn = + ;
const int mod = ;//const引用更快,宏定义也更快
const int INF = 1e9; struct edge
{
int next;//指向下一个节点
int u, v, w;
};
edge a[maxn];
int head[maxn], node;//node记录节点的数目,head[i]记录连接着i的第一条边
void addedge(int u, int v, int w)
{
a[node].u = u;
a[node].v = v;
a[node].w = w;
a[node].next = head[u];
head[u] = node++;
a[node].u = v;
a[node].v = u;
a[node].w = w;
a[node].next = head[v];
head[v] = node++;
}
struct Heapnode
{
int d, u;//d为距离,u为起点
Heapnode(){}
Heapnode(int d, int u):d(d), u(u){}
bool operator <(const Heapnode & a)const
{
return d > a.d;//这样优先队列先取出d小的
}
};
ll n, m;
bool v[maxn];//标记点是否加入集合
int d[maxn];//起点s到各个点的最短路
void init(int n)
{
node = ;
memset(head, -, sizeof(head));
}
priority_queue<Heapnode>q;
void dijkstra(ll s, ll n)//以s为起点
{
while(!q.empty())q.pop();
for(int i = ; i <= n; i++)d[i] = INF;
d[s] = ;
memset(v, , sizeof(v));
q.push(Heapnode(, s));
while(!q.empty())
{
Heapnode now = q.top();
q.pop();
ll u = now.u;//当前起点
if(v[u])continue;//如果已经加入集合,continue
v[u] = ;
for(int i = head[u]; i != -; i = a[i].next)
{
edge& e = a[i];//引用节省代码
if(d[e.v] > d[u] + e.w)
{
d[e.v] = d[u] + e.w;
q.push(Heapnode(d[e.v], e.v));
}
}
}
} int main()
{
ll n, m;
while(scanf("%lld%lld", &n, &m) != EOF)
{
if(n == || m == )
{
ll ans = INF, x;
for(int i = ; i < max(n, m); i++)
scanf("%lld", &x), ans = min(ans, x);
printf("%lld\n", ans);
continue;
}
ll x;
ll t = , s = (n - ) * (m - ) * + ;
init(s);
ll tmp = (m - ) * ;//每一行的数目
for(int i = ; i <= n; i++)
for(int j = ; j < m; j++)
{
scanf("%lld", &x);
if(i == )addedge(j * , t, x);
else if(i == n)addedge(s, (n - ) * tmp + * j - , x);
else addedge((i - ) * tmp + * j, (i - ) * tmp + * j - , x);
}
for(int i = ; i < n; i++)
for(int j = ; j <= m; j++)
{
scanf("%lld", &x);
if(j == )addedge(s, (i - ) * tmp + , x);
else if(j == m)addedge(i * tmp, t, x);
else addedge((i - ) * tmp + * j - , (i - ) * tmp + * j - , x);
}
for(int i = ; i < n; i++)
for(int j = ; j < m; j++)
{
scanf("%lld", &x);
addedge((i - ) * tmp + * j - , (i - ) * tmp + * j, x);
}
dijkstra(s, s);
printf("%d\n", d[t]);
}
return ;
}
BZOJ 1001 狼抓兔子 平面图的最小割的更多相关文章
- BZOJ 1001 狼抓兔子 (网络流最小割/平面图的对偶图的最短路)
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 算法讨论: 1.可以用最大流做,最大流等于最小割. 2.可以把这个图转化其对偶图,然 ...
- bzoj 1001 狼抓兔子 —— 平面图最小割(最短路)
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 平面图最小割可以转化成最短路问题: 建图时看清楚题目的 input ... 代码如下: ...
- BZOJ 1001 狼抓兔子 (最小割转化成最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 27715 Solved: 7134[Submit][ ...
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- bzoj 1001狼抓兔子(对偶图+最短路)最大流
推荐文章:<浅析最大最小定理在信息学竞赛中的应用>--周冬 题目 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ 1001 - 狼抓兔子 - [Dinic最大流][对偶图最短路]
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 Description现在小朋友们最喜欢的"喜羊羊与灰太狼", ...
- 【bzoi2006】【狼抓兔子】【最小割】
Description Source: Beijing2006 [BJOI2006] 八中OJ上本题链接:http://www.lydsy.com/JudgeOnline/problem.php?id ...
- BZOJ 1001 狼抓兔子
链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子 ...
- 【Bzoj】1001狼抓兔子(平面图最小割转对偶图最短路)
YEAH 题目链接 终于做对这道题啦 建图的艰辛难以言表- - 顺便说一句我队列转STL啦 狼抓兔子的地图符合平面图定义,于是将该图转成对偶图并求出对偶图的最短路即可. 这篇博客给了我极大的帮助 ...
随机推荐
- js和jQuery获取各种屏幕或文档的高度和宽度
1.jQuery获取文档或屏幕的高度 console.log($(window).height());//浏览器页面当前屏幕可见区域的高度 console.log($(document).height ...
- C# XML创建解析、XML格式化
导入命名空间: VS需要在项目中添加引用system.XML; 代码中添加 using System.XML和using System.IO; XML范例: <?xml version=&quo ...
- android RecyclerView简单的使用
转自:https://blog.csdn.net/lmj623565791/article/details/45059587 概述 RecyclerView出现已经有一段时间了,相信大家肯定不陌生了, ...
- Docker学习(二): 镜像的使用与构建
特别声明: 博文主要是学习过程中的知识整理,以便之后的查阅回顾.部分内容来源于网络(如有摘录未标注请指出).内容如有差错,也欢迎指正! =============系列文章============= 1 ...
- SpringBoot 之Quartz的使用
对于Quartz的使用,还是想说一句,SpringBoot真的很好用啊! 第一步:当然是引入依赖啦 <parent> <groupId>org.springframework. ...
- 分布式ID生成器PHP+Swoole实现(下) - 代码实现
上篇文章主要介绍<实现原理>,这篇看主要代码的编写. 实现IDGenerator类 64位ID由以下元素组成:固定位占2位,时间戳占41位,服务实例数字编号占4位,业务编号占10位,自增i ...
- 深入理解LinkedBlockingQueue
说明 通过阅读源码,了解LinkedBlockingQueue的特性.本文基于JDK1.7源码 正文 通过查询API对LinkedBlockingQueue特点进行简单的了解: LinkedBlo ...
- groovy实现循环、交换变量、多赋值、?.运算符
/** * Created by Jxy on 2019/1/3 10:01 * 1.实现循环的方式 * 2.安全导航操作符---?. * 3.一次性赋值给多个变量 */ 0.upto(2){ pri ...
- equals、==和hashCode
equals和== ==可以用于基本类型和引用类型:当用于基本类型时,比较值是否相同:当用于引用类型时,比较的是所指向的对象的地址是否相同.如果有包装类型,则先将包装类型转换为基本类型再比较值是否相等 ...
- oracle数据库的安装与连接关键点
一.window xp系统上安装Oracle Database 10G 解锁Scott.Hr账号并重置口令 远程连接数oracle数据库地址 二.在Mac系统上使用Navicat远程连接oracle数 ...