狼抓兔子 bzoj-1001 BeiJing2006

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

想法:显然,这题想求最小割。直接求最小割非常慢,我们考虑将它转换成对偶图。所谓对偶图,就是对于一个边和边之间没有交点的平面图来讲,对于每一个被边围出来的平面都看做一个点,如果原来平面上的边分割了两个平面,那么就将它对应的两个平面所构成的点之间连一条这条边权的边即可。然后跑最短路。

特别地,我们将start和end之间额外连一条边。然后我们将这条新连的边的将原来平面分成的两部分设为最短路中的七点和中点即可。

最后,附上丑陋的代码... ...在网上抄的代码(不会写对偶图)

#include <iostream>
#include <cstdio>
#include <queue>
using namespace std;
const int MAXV=2e6+105,MAXE=3e6+5,inf=0x7f7f7f7f;
int N,M,S,T;
struct E
{
int next,to,val;
}e[MAXE<<1];
int ecnt,G[MAXV];
void Edge(int u,int v,int w)
{
e[++ecnt]=(E){G[u],v,w};G[u]=ecnt;
e[++ecnt]=(E){G[v],u,w};G[v]=ecnt;
}
struct Node
{
int id,v;
bool operator<(const Node & ot)const
{return v>ot.v;}
};
priority_queue<Node> q;
bool inS[MAXV];int dis[MAXV];
int dijkstra()
{
for(int i=1;i<=T;i++)
{
dis[i]=inf;
}
dis[S]=0;
q.push((Node){S,0});
while(!q.empty())
{
int u=q.top().id;
q.pop();
if(inS[u]) continue;
inS[u]=true;
for(int i=G[u];i;i=e[i].next)
{
int v=e[i].to;
if(inS[v]) continue;
if(dis[v]>dis[u]+e[i].val)
{
dis[v]=dis[u]+e[i].val;
q.push((Node){v,dis[v]});
}
}
}
return dis[T];
}
int main()
{
int w;
scanf("%d%d",&N,&M);
if(N==1||M==1)
{
if(N>M) swap(N,M);
int ans=inf;
for(int i=1;i<=M;i++)
scanf("%d",&w),ans=min(ans,w);
printf("%d\n",ans);
}
else
{
S=2*(N-1)*(M-1)+1,T=S+1;
for(int i=1;i<M;i++)
{
int v=i*2;
scanf("%d",&w);
Edge(S,v,w);
}
for(int i=2;i<N;i++)
{
for(int j=1;j<M;j++)
{
int u=2*((i-2)*(M-1)+j)-1,v=2*((i-1)*(M-1)+j);
scanf("%d",&w);
Edge(u,v,w);
}
}
for(int i=1;i<M;i++)
{
int u=2*((N-2)*(M-1)+i)-1;
scanf("%d",&w);
Edge(u,T,w);
}
for(int i=1;i<N;i++)
{
for(int j=1;j<=M;j++)
{
scanf("%d",&w);
if(j==1)
{
int u=2*((i-1)*(M-1)+j)-1;
Edge(u,T,w);
}
else if(j==M)
{
int v=2*((i-1)*(M-1)+j-1);
Edge(S,v,w);
}
else
{
int u=2*((i-1)*(M-1)+j-1),v=u+1;
Edge(u,v,w);
}
}
}
for(int i=1;i<N;i++)
{
for(int j=1;j<M;j++)
{
int u=2*((i-1)*(M-1)+j)-1,v=u+1;
scanf("%d",&w);
Edge(u,v,w);
}
}
printf("%d\n",dijkstra());
}
return 0;
}

[bzoj1001][BeiJing2006]狼抓兔子_网络流_最小割转对偶图的更多相关文章

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

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

  2. 【BZOJ1001】狼抓兔子(网络流)

    [BZOJ1001]狼抓兔子(网络流) 题面 Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨, ...

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

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

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

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

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

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

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

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

  7. BZOJ1001: [BeiJing2006]狼抓兔子【最短路+对偶图】

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Se ...

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

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

  9. Bzoj1001 [BeiJing2006]狼抓兔子

    Time Limit: 15 Sec  Memory Limit: 162 MBSubmit: 19759  Solved: 4883 Description 现在小朋友们最喜欢的"喜羊羊与 ...

随机推荐

  1. LeetCode.3-最长无重复字符子串(Longest Substring Without Repeating Characters)

    这是悦乐书的第341次更新,第365篇原创 01 看题和准备 今天介绍的是LeetCode算法题中Medium级别的第2题Longest Substring Without Repeating Cha ...

  2. Speex回声消除原理深度解析

    这里假设读者具有自适应滤波器的基础知识.Speex的AEC是以NLMS为基础,用MDF频域实现,最终推导出最优步长估计:残余回声与误差之比.最优步长等于残余回声方差与误差信号方差之比,这个结论可以记下 ...

  3. WinSocket简单聊天程序客户端

    #pragma comment(lib,"Ws2_32.lib") #include <stdio.h> #include <Winsock2.h> SOC ...

  4. html body中的标签

    HTML中的标签有两类 一.字体标签 字体标签包含:h1~h6.<font>.<u>.<b>.<strong><em>.<sup> ...

  5. "etc/profile" E212: Can't open file for writing

    今天安装Java环境,出现如下错误: "etc/profile" E212: Can't open file for writing 这是安装到本地JDK路径不正确导致.怎么办呢? ...

  6. 详细解读css中的浮动以及清除浮动的方法

    对于前端初学者来说,css浮动部分的知识是一块比较难以理解的部分,下面我将把我学习过程中的心得分享给大家. 导读:   1.css块级元素讲解 2.css中浮动是如何产生的 3.出现浮动后,如何清除浮 ...

  7. Android第三方登陆之新浪微博Weibo篇(原生登陆授权)

    前言 Android第三方登录可以说是非常的常见,今天主要先说一下新浪微博第三方登陆授权. SDK版本支持 SDK v3.0已经发布了支持iPhone和Android的版本. 须将你的应用的包名签名信 ...

  8. angular js 公告墙

    <!DOCTYPE html>   <html lang="en">   <head>   <meta charset="UTF ...

  9. 设置浏览器让js报错

    ie-工具---internet选项--高级--“禁用脚本提示”前面那个框的勾去掉---“显示每个脚本错误的通知”给该项打勾 注意:此时是静态页面很容易提示出错误的行号,但是当js是动态页面的时候,浏 ...

  10. 【Oracle】进入sqlplus 删除键backspace时出现^H

    当oracle进入sqlplus后,输入命令时候出现错误,我们按平时的习惯使用backspace键删除错误信息,此时会出现^H 解决办法:进入sqlplus之前,使用stty erase '^H'命令 ...