【bzoj】 1412: [ZJOI2009]狼和羊的故事

Description

“狼爱上羊啊爱的疯狂,谁让他们真爱了一场;狼爱上羊啊并不荒唐,他们说有爱就有方向......” Orez听到这首歌,心想:狼和羊如此和谐,为什么不尝试羊狼合养呢?说干就干! Orez的羊狼圈可以看作一个n*m个矩阵格子,这个矩阵的边缘已经装上了篱笆。可是Drake很快发现狼再怎么也是狼,它们总是对羊垂涎三尺,那首歌只不过是一个动人的传说而已。所以Orez决定在羊狼圈中再加入一些篱笆,还是要将羊狼分开来养。 通过仔细观察,Orez发现狼和羊都有属于自己领地,若狼和羊们不能呆在自己的领地,那它们就会变得非常暴躁,不利于他们的成长。 Orez想要添加篱笆的尽可能的短。当然这个篱笆首先得保证不能改变狼羊的所属领地,再就是篱笆必须修筑完整,也就是说必须修建在单位格子的边界上并且不能只修建一部分。

Input

文件的第一行包含两个整数n和m。接下来n行每行m个整数,1表示该格子属于狼的领地,2表示属于羊的领地,0表示该格子不是任何一只动物的领地。

Output

文件中仅包含一个整数ans,代表篱笆的最短长度。

Sample Input

2 2
2 2
1 1

Sample Output

2

数据范围
10%的数据 n,m≤3
30%的数据 n,m≤20
100%的数据 n,m≤100
明显最小割 
挖掘栅栏的本质:只能建在相邻两个,且建好后使得狼和羊之间不存在通路。而割的定义是:使S集和T集不存在通路。而题目又要求建的栅栏最少,于是就是最小割问题了。
主要是建边 从源点连向狼的无穷边
从羊向汇点的无穷边 
再是狼到空地和羊
空地到空地和羊
  1 #include<queue>
  2 #include<cstdio>
  3 #include<iostream>
  4 #define MAXN 100010
  5 
  6 const int INF=0x7fffffff;
  7 
  8 using namespace std;
  9 
 10 int map[101][101];
 11 
 12 int n,m,st,en,ans; 
 13 
 14 int x[4]={0,1,0,-1};
 15 int y[4]={1,0,-1,0};
 16 
 17 struct node {
 18     int to;
 19     int next;
 20     int val;
 21 };
 22 node e[MAXN];
 23 
 24 int head[MAXN],tot=1;
 25 
 26 int depth[MAXN],cur[MAXN];
 27 
 28 queue<int> q;
 29 
 30 inline void read(int&x) {
 31     int f=1;x=0;char c=getchar();
 32     while(c>'9'||c<'0') {if(c=='-') f=-1;c=getchar();}
 33     while(c>='0'&&c<='9') {x=(x<<1)+(x<<3)+c-48;c=getchar();}
 34     x=x*f;
 35 }
 36 
 37 inline void add(int x,int y,int val) {
 38     e[++tot].to=y;
 39     e[tot].val=val;
 40     e[tot].next=head[x];
 41     head[x]=tot;
 42 }
 43 
 44 inline int bfs() {
 45     for(int i=0;i<=en;i++) cur[i]=head[i],depth[i]=-1;
 46     while(!q.empty()) q.pop();
 47     q.push(st);depth[st]=0;
 48     while(!q.empty()) {
 49         int u=q.front();
 50         q.pop();
 51         for(int i=head[u];i!=0;i=e[i].next) {
 52             int to=e[i].to;
 53             if(e[i].val>0&&depth[to]==-1) {
 54                 depth[to]=depth[u]+1;
 55                 q.push(to);
 56                 if(to==en) return true;
 57             } 
 58         }
 59     }
 60     return false;
 61 }
 62 
 63 inline int dinic(int now,int flow) {
 64     if(now==en) return flow;
 65     int rest=0,delat;
 66     for(int & i=cur[now];i!=0;i=e[i].next) {
 67         int to=e[i].to;
 68         if(depth[to]==depth[now]+1&&e[i].val>0) {
 69             delat=dinic(to,min(e[i].val,flow-rest));
 70             if(delat) {
 71                 e[i].val-=delat;
 72                 e[i^1].val+=delat;
 73                 rest+=delat;
 74                 if(rest==flow) break;
 75             }
 76         }
 77     }
 78     if(flow!=rest) depth[now]=-1;
 79     return rest;
 80 }
 81 
 82 int main() {
 83     read(n);read(m);
 84     en=n*m+1;
 85     for(int i=1;i<=n;i++)
 86       for(int j=1;j<=m;j++) {
 87           read(map[i][j]);
 88           if(map[i][j]==1) add(st,(i-1)*m+j,INF),add((i-1)*m+j,st,0);
 89           else if(map[i][j]==2) add((i-1)*m+j,en,INF),add(en,(i-1)*m+j,0);
 90       }
 91     for(int i=1;i<=n;i++) 
 92       for(int j=1;j<=m;j++) 
 93         for(int k=0;k<4;k++) {
 94             int xx=i+x[k];
 95             int yy=j+y[k];
 96             if(xx<1||yy<1||xx>n||yy>m||map[i][j]==2) continue;
 97             if(map[xx][yy]!=1) add((i-1)*m+j,(xx-1)*m+yy,1),add((xx-1)*m+yy,(i-1)*m+j,0);
 98         } 
 99     while(bfs()) ans+=dinic(st,INF);
100     printf("%d\n",ans);
101     return 0;
102 } 
代码

 

转载于:https://www.cnblogs.com/whistle13326/p/7192828.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/572213.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机基础--网络

互联网协议 互联网协议的功能&#xff1a;定义计算机如何接入internet&#xff0c;以及接入internet的计算机通信的标准。 互联网协议按照功能不同分为osi七层或者tcp/ip五层或tcp/ip四层 每层常见物理设备 因为学习python编程只需要了解tcp/ip五层模型&#xff0c;所以我们只需…

万字详解数据库连接池

数据库连接池的概念 数据库连接是一种关键的、有限的、昂贵的资源&#xff0c;这一点在多用户的网页应用程序中体现得尤为突出。对数据库连接的管理能显著影响到整个应用程序的伸缩性和健壮性&#xff0c;影响到程序的性能指标。数据库连接池正是针对这个问题提出来的。数据库连…

Win Linux 双系统安装指南

双系统安装指南 环境说明 硬件&#xff1a;一块240G NVMe&#xff0c;一块240G SSD&#xff0c;一块2T的HDD。 系统&#xff1a;Linux Mint 18.2&#xff0c;Windows 10 Enterprise Version 1703 Update June 2017 分配&#xff1a;由于工作原因&#xff0c;我的主系统为Linux …

JDBC自定义框架

自定义JDBC框架&#xff1a; 定义必要的信息、获取数据库的连接、释放资源都是重复的代码&#xff0c;在操作JDBC时通常都是执行SQL语句就可以了&#xff0c;所以需要抽取出来一个模板类来封装一些方法&#xff08;Update、Query&#xff09;&#xff0c;专门执行增删改查的SQL…

SpingMVC 执行的流程

一&#xff1a;SpringMVC的开发步骤 ①&#xff1a;在web.xml文件中定义前端控制器DispatcherServlet来拦截用户请求。 由于Web应用是基于请求/响应结构的应用&#xff0c;所以不管哪个MVC Web框架&#xff0c;都需要在web.xml中配置该框架的核心Servlet或Filter&#xff0c;这…

UI 07 _ 导航视图控制器 与 属性传值

首先, 先创建三个VC. 完毕点击按钮, 进入下一页, 并可以返回. 要先把导航视图控制器创建出来. 在AppDelegate.m 文件里代码例如以下: #import "AppDelegate.h" #import "MainViewController.h" interface AppDelegate () endimplementation AppDelegate …

el表达式具体解释

引用内容百度百科(http://baike.baidu.com/view/1488964.htm) 參考百度百科&#xff0c;然后自己又加入了一部分自己感觉实用的东西&#xff0c;整理一下希望对大家有所帮助&#xff01;E L&#xff08;Expression Language&#xff09; 目的&#xff1a;为了使JSP写起来更加简…

MyBatis接口代理

MyBatis接口代理&#xff1a; 采用 Mybatis 的代理开发方式实现 DAO 层的开发&#xff0c;这种方式是目前的主流方式。Mapper 接口开发方法只需要程序员编写Mapper 接口&#xff08;相当于Dao 接口&#xff09;&#xff0c;由Mybatis 框架根据接口定义创建接口的动态代理对象&a…

编译OSG的FreeType插件时注意的问题

使用自己编译的freetype.lib&#xff0c;在编译osgdb_freetype插件项目时&#xff0c;报错LINK错误&#xff0c;找不到png的一堆函数 最简单的方式是不要使用PNG编译freetype。记住不要犯贱。 转载于:https://www.cnblogs.com/coolbear/p/7205906.html

openresty总结

协程 1.例如当获取的数据没有前后依赖关系时&#xff0c;可以使用ngx.thread.spawn和ngx.thread.wait同时从数据库不同的库、表或者不同来源&#xff08;mysql&#xff0c;redis等&#xff09;获取数据。https://github.com/openresty/lua-nginx-module#ngxthreadspawnhttps://…

PageHelper分页插件使用

分页插件PageHelper&#xff1a; MyBatis没有分页功能&#xff0c;需要手动编写LIMIT语句&#xff0c;可以使用第三方的插件来对功能进行扩展&#xff0c;分页助手PageHelper是将分页的复杂操作进行封装&#xff0c;使用简单的方式即可获得分页的相关数据 PageInfo&#xff1a;…

jquery插件开发通用框架

2017-07-24 更新&#xff1a;增加单例模式。 jquery插件开发框架代码&#xff1a; /** 插件编写说明&#xff1a;* 1、插件命名&#xff1a;jquery.[插件名].js&#xff0c;如jquery.plugin.js* 2、对象方法添加到jQuery.fn上&#xff0c;全局方法添加到jQuery对象本身上* 3、插…

Mybatis多表模型

多表模型&#xff1a; 多表模型分类 一对一&#xff1a;在任意一方建立外键&#xff0c;关联对方的主键。一对多&#xff1a;在多的一方建立外键&#xff0c;关联一的一方的主键。多对多&#xff1a;借助中间表&#xff0c;中间表至少两个字段&#xff0c;分别关联两张表的主键…

关于zkfc与zkserver频繁断开的问题

详见http://blog.csdn.net/dslztx/article/details/51596951转载于:https://www.cnblogs.com/roger888/p/7211625.html

高动态范围红外图像压缩

BF&DRC 近期看了一篇高动态范围红外图像压缩的文章&#xff0c;《New technique for the visualization of high dynamic range infrared images》.这篇文章主要利用双边滤波器把宽动态红外图像切割为基本图像和细节图像&#xff0c;再分别对基本图像和细节图像进行处理。对…

Mybatis构建sql语法

构建sql&#xff1a; 之前通过注解开发时&#xff0c;相关 SQL 语句都是自己直接拼写的。一些关键字写起来比较麻烦、而且容易出错。MyBatis 给我们提供了 org.apache.ibatis.jdbc.SQL 功能类&#xff0c;专门用于构建 SQL 语句 常用方法&#xff1a; 查询功能的实现&#xf…

Mqtt协议IOS端移植3

ServerMqFramework.h #import "MqttFramework.h"interface ServerMqFramework : MqttFramework/*** brief 得到模块控制器的句柄单例** param [in] N/A* param [out] N/A* return void* note*/(ServerMqFramework*)getMQttServerFrameInstance;- (int)callBusine…

java第三课,流程控制语句

流程控制语句条件语句&#xff1a;if语句&#xff1a;*if&#xff08;条件 boolean类型&#xff09;{ true }*if(boolean表达式){true}else&#xff5b;false结果&#xff5d;*多重 if else if(){}else if(){}else *嵌套ifSwitch语句&#xff1a;*switch(表达式){ case…

在cli命令行上显示当前数据库,以及查询表的行头信息

在$HIVE_HOME/conf/hive-site.xml文件下加入以下配置文件 <property><name>hive.cli.print.header</name><value>true</value><description>Whether to print the names of the columns in query output.</description> </proper…

两点之间最短路径:弗洛伊德算法

弗洛伊德算法是计算无向有权图中两点间最短路径的算法&#xff0c;复杂度为O(n^3)。其思路是将两点间距离分为过&#xff08;指定的&#xff09;第三点或是不过&#xff0c;然后取它们的最小值&#xff0c;如此循环就可以得到两点之间真正的最小值。 void floyd() {for (int k …