BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路
原文链接http://www.cnblogs.com/zhouzhendong/p/8686871.html
题目传送门 - BZOJ1001
题意
长成上面那样的网格图求最小割。
$n,m\leq 1000$
题解
网格图先转个对偶图,然后SPFA跑一发就完事了。
或者你可以这样理解。
你要从红色区域到蓝色区域连一条路径,比如橙色或者绿色。
(其中绿色就是答案)
然后话费就是经过的边权值和。
然后你会发现消耗一条边的权值所达到的效果是沟通那条边所分割的两个区域。于是发现,以空白区域为节点,原图的边为边,最短路就是答案。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=2000005,M=1005;
struct Gragh{
int cnt,y[N*3],z[N*3],nxt[N*3],fst[N];
void clear(){
cnt=0;
memset(fst,0,sizeof fst);
}
void add(int a,int b,int c){
y[++cnt]=b,z[cnt]=c,nxt[cnt]=fst[a],fst[a]=cnt;
}
}g;
int n,m,nm,S,T;
void build(){
int x,a,b;
g.clear();
for (int i=1;i<=n;i++)
for (int j=1;j<m;j++){
scanf("%d",&x);
a=i==1?S:((i-2)*(m-1)+j);
b=i==n?T:((i-1)*(m-1)+j+nm);
g.add(a,b,x),g.add(b,a,x);
}
for (int i=1;i<n;i++)
for (int j=1;j<=m;j++){
scanf("%d",&x);
a=j==m?S:((i-1)*(m-1)+j);
b=j==1?T:((i-1)*(m-1)+j-1+nm);
g.add(a,b,x),g.add(b,a,x);
}
for (int i=1;i<n;i++)
for (int j=1;j<m;j++){
scanf("%d",&x);
a=(i-1)*(m-1)+j;
b=(i-1)*(m-1)+j+nm;
g.add(a,b,x),g.add(b,a,x);
}
}
int vis[N],d[N],q[N],head,tail;
int SPFA(int S,int T){
int n=T,qmod=n+1,x,y;
head=tail=0;
memset(d,63,sizeof d);
memset(vis,0,sizeof vis);
d[S]=0,vis[S]=1,q[++tail]=S;
while (head!=tail){
vis[x=q[head=(head+1)%qmod]]=0;
for (int i=g.fst[x];i;i=g.nxt[i]){
y=g.y[i];
if (d[y]>d[x]+g.z[i]){
d[y]=d[x]+g.z[i];
if (!vis[y])
vis[q[tail=(tail+1)%qmod]=y]=1;
}
}
}
return d[T];
}
int main(){
scanf("%d%d",&n,&m),nm=(n-1)*(m-1);
S=2*nm+1,T=S+1;
build();
printf("%d",SPFA(S,T));
return 0;
}
BZOJ1001 [BeiJing2006]狼抓兔子 最小割 对偶图 最短路的更多相关文章
- BZOJ1001: [BeiJing2006]狼抓兔子 [最小割 | 对偶图+spfa]
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MBSubmit: 19528 Solved: 4818[Submit][ ...
- 【bzoj1001】[BeiJing2006]狼抓兔子 最小割+对偶图+最短路
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的,而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- [bzoj 1001][Beijing2006]狼抓兔子 (最小割+对偶图+最短路)
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001: [BeiJing2006]狼抓兔子 (最小割转最短路)
浅析最大最小定理在信息学竞赛中的应用---周东 ↑方法介绍 对于一个联通的平面图G(满足欧拉公式) 在s和t间新连一条边e; 然后建立一个原图的对偶图G*,G*中每一个点对应原图中每一个面,每一条边对 ...
- bzoj1001: [BeiJing2006]狼抓兔子 -- 最小割
1001: [BeiJing2006]狼抓兔子 Time Limit: 15 Sec Memory Limit: 162 MB Description 现在小朋友们最喜欢的"喜羊羊与灰太狼 ...
- BZOJ1001[BeiJing2006]狼抓兔子最小割網絡流
Description 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一 ...
- BZOJ1001[BeiJing2006]狼抓兔子——最小割
题目描述 现在小朋友们最喜欢的"喜羊羊与灰太狼",话说灰太狼抓羊不到,但抓兔子还是比较在行的, 而且现在的兔子还比较笨,它们只有两个窝,现在你做为狼王,面对下面这样一个网格的地形: ...
- bzoj 1001 [BeiJing2006]狼抓兔子——最小割转最短路
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1001 #include<cstdio> #include<cstring& ...
- bzoj1001/luogu4001 狼抓兔子 (最小割/平面图最小割转对偶图最短路)
平面图转对偶图:先在原图中加一个s->t的边,然后对每个面建一个点,对每条分隔两个面的边加一条连接这两个面对应点的边,边权等于原边权. 然后从刚才加的s->t分割出来的两面对应的两个点跑最 ...
随机推荐
- WinCE平台的程序编译到Win32平台下运行
最近做的项目中,有一个在WinCE平台上跑的程序,后来随着项目的发展,要求此程序在PC上也能跑.感谢VS 2005提供的多平台支持,只需要几分钟就可以解决这个问题,方法很简单,下面是我处理的过程. 1 ...
- Vue - Router 路由
路由的注册 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【原创】大数据基础之Hive(5)hive on spark
hive 2.3.4 on spark 2.4.0 Hive on Spark provides Hive with the ability to utilize Apache Spark as it ...
- js——prototype、__proto__、constructor
Object 1. Object是一个函数(typeof O ...
- android招聘啦,美图秀秀欢迎你加入!
前言 最近朋友公司招聘,美图秀秀大家一定很熟悉吧,欢迎你的加入. 了解相关更多技术以外的,可参考<除了敲代码,你还有什么副业吗?>,再往下看,今天给需要换工作或者还未找到工作的童鞋们谋一个 ...
- swift 学习- 24 -- 协议 01
// 协议 定义了一个蓝图, 规定了用来实现某一特定任务或者功能的方法, 属性, 以及其他需要的东西. // 类, 结构体, 或 枚举都可以遵循协议, 并且为协议定义的这些要求 提供具体的实现, 某个 ...
- Eclipse切换工作空间(Workspace)
通过主菜单 File(文件) -> Switch WorkSpace(切换工作空间).可以切换不同的工作空间,工作空间本身对应的是一个文件夹,其中会包含一个 .metadata 文件夹,应该是用 ...
- Oracle中如何查询CLOB字段类型的内容
注:本文来源于:<Oracle中如何查询CLOB字段类型的内容> 语法 select * from table_name where dbms_lob.instr(字段名(clod类型), ...
- Confluence 6 SQL Server 输入你的数据库细节
Confluence 的安装向导将会指导你一步一步的在 Confluence 中配置安装 SQL Server 数据库. 使用 JDBC 连接(默认) JDBC 是推荐的连接你的 Confluence ...
- Confluence 6 Oracle 创建数据库用户
创建用户后并且指派权限: 使用 sqlplus 命令行工具通过命令行来访问 Oracle sqlplus user/password <as sysdba|as sysoper> 如果你的 ...