【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子
【题目大意】
左上角点为(1,1),右下角点为(N,M)(上图中N=4,M=5).有以下三种类型的道路
1:(x,y)<==>(x+1,y)
2:(x,y)<==>(x,y+1)
3:(x,y)<==>(x+1,y+1)
道路上的权值表示这条路上最多能够通过的兔子数,道路是无向的。开始时所有的兔子都聚集在左上角(1,1)的窝里,现在它们要跑到右下解(N,M)的窝中去,如果一条道路上最多通过的兔子数为K,需要同样数量的K只狼伏击,求封锁道路的最小狼数。
【思路】
显然这是最小割,但是最小割效率太低。可以发现这是一张平面图,根据平面图的性质,平面图最小割=对偶图的最短路。所谓对偶图,简单理解就是把面转为点,然后将面之间的边作为连接两个点的边。本题中建立的对偶图如下:

显然可以发现,最短路必然是最小割。
【错误点】
注意一下面转点后,对偶图点的数量和原来点的数量不一样,大概为2倍,数组要开足够大,否则RE!
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#include<queue>
#include <utility>
#define S 0
#define T 2*(m-1)*(n-1)+1
using namespace std;
const int MAXN=;
const int INF=0x7fffffff;
struct edge
{
int fr,to,len;
};
int n,m,w;
vector<edge> E[MAXN]; void addedge(int u,int v,int w)
{
//cout<<"!"<<u<<' '<<v<<' '<<w<<endl;
E[u].push_back((edge){u,v,w});
E[v].push_back((edge){v,u,w});
} int dijkstra()
{
priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > que;
int dis[MAXN],vis[MAXN];
memset(vis,,sizeof(vis));
for (int i=S+;i<=T;i++) dis[i]=INF;
dis[S]=;
que.push(make_pair<int,int>(,S));
while (!que.empty())
{
int head=que.top().second;que.pop();
if (!vis[head])
{
vis[head]=;
for (int i=;i<E[head].size();i++)
{
edge Edge=E[head][i];
if (!vis[Edge.to] && dis[Edge.to]>dis[Edge.fr]+Edge.len)
{
dis[Edge.to]=dis[Edge.fr]+Edge.len;
que.push(make_pair<int,int>(dis[Edge.to],Edge.to));
}
}
}
}
return (dis[T]);
} void init()
{
for (int i=;i<n;i++)
for (int j=;j<m-;j++)
{
scanf("%d",&w);
if (i==) addedge(*(j+),T,w);
else if (i==n-) addedge(S,(n-)*(m-)*+*j+,w);
else addedge((i-)*(m-)*+*j+,i*(m-)*+*j+,w);
}
for (int i=;i<n-;i++)
for (int j=;j<m;j++)
{
scanf("%d",&w);
if (j==) addedge(S,i**(m-)+,w);
else if (j==m-) addedge((i+)**(m-),T,w);
else addedge(i**(m-)+j*,i**(m-)+*j+,w);
}
for (int i=;i<(n-);i++)
for (int j=;j<(m-);j++)
{
scanf("%d",&w);
//cout<<i<<' '<<j<<' ';
addedge(i**(m-)+*j+,i**(m-)+*j+,w);
}
} int main()
{
scanf("%d%d",&n,&m);
if (n== && m==) cout<<<<endl;
else
{
init();
cout<<dijkstra()<<endl;
}
return ;
}
【平面图最小割】BZOJ1001- [BeiJing2006]狼抓兔子的更多相关文章
- BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*
BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...
- [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 31805 Solved: 8494[Submit][ ...
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)
1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...
- BZOJ1001: [BeiJing2006]狼抓兔子【最短路+对偶图】
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Se ...
- BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 30078 Solved: 7908[Submit][ ...
- [bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图
狼抓兔子 bzoj-1001 BeiJing2006 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
随机推荐
- spring-boot-单元测试参数数
简单案例 @RunWith(Parameterized.class) public class ParameterTest { // 2.声明变量存放预期值和测试数据 private String f ...
- 使用隐藏form表单下载文件,解决url方式下载,由于环境问题而限制url长度,满足不了所有的需求!
一 对于某些环境导出是直接用wiondow.href=url直接导出下载,有些业务需求,如员工档案等字段比较多的时候,全选导出就会引发异常,由于Nginx转发长度限制的问题, 如果运维不愿意改变环境, ...
- IDL界面程序直接调用envi菜单对应功能
参考自http://blog.sina.com.cn/s/blog_764b1e9d010115qu.html 参考文章的方法是构建一个button控件,通过单击实现,这种方法比较复杂,不是我们经常能 ...
- html-表格和列表
一:表格标签 表格 描述 <table> 定义表格 <caption> 定义表格标题. <th> 定义表格的表头. <tr> 定义表格的行. <t ...
- [转] Cacti+Nagios监控平台完美整合
Cacti+Nagios监控平台完美整合 http://os.51cto.com/art/201411/458006.htm 整合nagios+cacti+微信.飞信实现网络监控报警 http://b ...
- Service(一):认识service、绑定Service
Activity是与用户打交道的,而Service是在后台运行的. 这个程序介绍了下如何启动和停止一个Service,以及在后台打印消息,我添加了一些注释. 在activity_main中将布局改为线 ...
- POJ 3280 Cheapest Palindrome(区间DP求改成回文串的最小花费)
题目链接:http://poj.org/problem?id=3280 题目大意:给你一个字符串,你可以删除或者增加任意字符,对应有相应的花费,让你通过这些操作使得字符串变为回文串,求最小花费.解题思 ...
- (四)Jsoup 获取 DOM 元素属性值
第一节: Jsoup 获取 DOM 元素属性值 Jsoup获取DOM元素属性值 比如我们要获取博客的href属性值: 我们这时候就要用到Jsoup来获取属性的值 : 我们给下示例代码: package ...
- 入门ROS教程与视频汇总(kinetic)
参考网址: Richard Wang 3 Shawn Chen 部分视频网址: http://v.youku.com/v_show/id_XMjUxMTc5MzE5Mg http://i.you ...
- INSTEAD OF与AFTER触发器
INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...