题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001

1001: [BeiJing2006]狼抓兔子

Time Limit: 15 Sec  Memory Limit: 162 MB
Submit: 27684  Solved: 7127

Description

现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,
而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形:

 

左上角点为(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只狼,
才能完全封锁这条道路,你需要帮助狼王安排一个伏击方案,使得在将兔子一网打尽的前提下,参与的
狼的数量要最小。因为狼还要去找喜羊羊麻烦.

Input

第一行为N,M.表示网格的大小,N,M均小于等于1000.
接下来分三部分
第一部分共N行,每行M-1个数,表示横向道路的权值. 
第二部分共N-1行,每行M个数,表示纵向道路的权值. 
第三部分共N-1行,每行M-1个数,表示斜向道路的权值. 
输入文件保证不超过10M

Output

输出一个整数,表示参与伏击的狼的最小数量.

Sample Input

3 4
5 6 4
4 3 1
7 5 3
5 6 7 8
8 7 6 5
5 5 5
6 6 6

Sample Output

14

题外话:看着这图想到对偶图,然后就想起了bzoj2007海拔那题......

题解:题意就是求最小割,把平面图转化成对偶图然后从右上角到左下角跑dijkstra就可以了......注意双向边,数组开大点。

(一开始用vector写结果爆内存了,还是数组好用...)

 #include<bits/stdc++.h>
#define CLR(a, b) memset((a), (b), sizeof((a)))
using namespace std;
const int INF = 1e9+;
const int N = 2e6+;
const int M = *N;
int head[N];
int d[N], vis[N];
struct Edge{
int v, c, nex;
}E[M];
int num = ;
void add(int u,int v,int c){
E[num].v = v; E[num].c = c; E[num].nex = head[u];
head[u] = num++;
}
struct qnode{
int v,c,x;
qnode(int _v=,int _c=,int _x=):v(_v),c(_c),x(_x){}
bool operator < (const qnode &r)const{
return r.c<c;
}
};
void dij(int s, int n) {//起点、终点
CLR(vis, );
for(int i = ; i <= n; i++) d[i] = INF;
priority_queue<qnode>q;
while(!q.empty()) q.pop();
d[s] = ;
q.push(qnode(s, ));
qnode t;
while(!q.empty()) {
t = q.top(); q.pop();
int u = t.v;
if(vis[u])continue;
vis[u] = true;
for(int i = head[u]; ~i; i = E[i].nex) {
int v = E[i].v;
int c = E[i].c;
if(!vis[v] && d[v] > d[u] + c) {
d[v] = d[u] + c;
q.push(qnode(v, d[v]));
}
}
}
}
int main() {
int n, m;
int k, i, j, u, v, w;
CLR(head,-); CLR(E, ); scanf("%d%d", &n, &m);
int s = ; //起点
int t = *(n-)*(m-)+;//终点 for(i = ; i <= n; ++i) {
for(j = ; j < m; ++j) {
scanf("%d", &w);
u = ( i==? s : (*(i-)-)*(m-)+j );
v = ( i==n? t : *(i-)*(m-)+j );
add(u, v, w); add(v, u, w);
}
}
for(i = ; i < n; ++i) {
for(j = ; j <= m; ++j) {
scanf("%d", &w);
u = ( j==m? s : *(i-)*(m-)+j-+m );
v = ( j==? t : *(i-)*(m-)+j- );
add(u, v, w); add(v, u, w);
}
}
for(i = ; i < n; ++i) {
for(j = ; j < m; ++j) {
scanf("%d", &w);
u = *(i-)*(m-)+j;
v = (*(i-)+)*(m-)+j;
add(u, v, w); add(v, u, w);
}
} dij(s, t);
printf("%d\n", d[t]);
return ;
}

2640ms

BZOJ1001: [BeiJing2006]狼抓兔子【最短路+对偶图】的更多相关文章

  1. BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 19528  Solved: 4818[Submit][ ...

  2. [BZOJ1001] [Beijing2006] 狼抓兔子 (最短路)

    Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个 ...

  3. BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路

    原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html 题目传送门 - BZOJ1001 题意 长成上面那样的网格图求最小割. $n,m\leq ...

  4. BZOJ1001 BeiJing2006 狼抓兔子 【网络流-最小割】*

    BZOJ1001 BeiJing2006 狼抓兔子 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较 ...

  5. [BZOJ1001][BeiJing2006]狼抓兔子(最小割转最短路|平面图转对偶图)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 31805  Solved: 8494[Submit][ ...

  6. BZOJ1001: [BeiJing2006]狼抓兔子(优化的dinic或转化对偶图求最短路)

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 30078  Solved: 7908[Submit][ ...

  7. BZOJ 1001: [BeiJing2006]狼抓兔子(最短路)

    平面图的最小割转化为对偶图的最短路(资料:两极相通——浅析最大最小定理在信息学竞赛中的应用) ,然后DIJKSTRA就OK了. ------------------------------------ ...

  8. bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割

    1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec  Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...

  9. bzoj1001: [BeiJing2006]狼抓兔子(初识是你最小割)

    1001: [BeiJing2006]狼抓兔子 题目:传送门 题解: 听说这题当初是大难题...可惜当年没有网络流hahahha 现在用网络流的思想就很容易解决了嘛 给什么连什么,注意是双向边,然后跑 ...

随机推荐

  1. 关于发布程序之后js文件存在缓存问题

    把js文件加上版本号即可解决 如: <script src="../Static/js/Contract/ContractRateEdit.js?t=20181210"> ...

  2. SQL中利用ROW_NUMBER()进行分页查询

    SELECT ContractName ,ContractNO, State,CreateDate FROM (SELECT ContractName ,ContractNO,CreateDate, ...

  3. Node.js函数

    Node.js 函数 在JavaScript中,一个函数可以作为另一个函数的参数.我们可以先定义一个函数,然后传递,也可以在传递参数的地方直接定义函数. Node.js中函数的使用与Javascrip ...

  4. [C#]简单离线注册码生成与验证

    本文使用RSA非对称加密和Base64简单地实现离线注册码的生成与验证功能. 主要思路就是提供者持有密钥,通过RSA加密客户机标识或时间标识,再通过Base64加密成不太难看的注册码,然后分发给客户机 ...

  5. Caused by: org.hibernate.HibernateException: identifier of an instance of ... is alterde from

    Caused by: org.hibernate.HibernateException: identifier of an instance of ... is alterde from     Hi ...

  6. 写一个有字符界面的ssh链接工具

    大概的样子 这是大致的样子- 写之前想说的 因为个人工作的的电脑是deepin系统的,系统本身的命令行非常好用,用第三方的ssh工具用不习惯,就想自己写一个. shell脚本是第一次写,写的不是很好, ...

  7. 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "Latin1_General_100_CI_AS" 之间的排序规则冲突。

    问题 操作临时表时提示如下排序规则冲突错误 sql ....忽略...sql ..... 无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 " ...

  8. Java Swing实战(五)表格组件JTable(1)

    dbPanel面板的配置告一段落. 接下来配置taskPanel 面板. /** * @author: lishuai * @date: 2018/11/26 13:51 */ public clas ...

  9. Golang beego ORM + CRUP 操作详解

      构建beego Web 项目         首先构建一个beego 的web 项目,这个我们完全可以参考beego 官网中的开发文档,上面介绍的非常的详细,在这我就不给大家介绍,主要是介绍ORM ...

  10. Linux:curl

    curl命令用来做HTTP协议的客户端,可以通过命令参数生成各种请求,非常强大. 1. GET 默认情况下下curl执行的是GET操作,所以可以当做wget使用如 $ curl https://www ...