问题描述

LG2598

BZOJ1412


题解

看到要把狼和羊两个物种分开

自然想到最小割。

发现\((x,y)\)可以向上下左右走以获得贡献,所以建边:\((x,y),(x-1,y)\),\((x,y),(x,y-1)\),\((x,y),(x,y+1)\),\((x,y),(x+1,y)\)(要在矩阵内)

这些边的边权为\(1\),代表在这里建立栅栏(割断边)要\(1\)的代价

然后从源点向狼,羊向汇点建边,边权为\(INF\),代表不可割断。


\(\mathrm{Code}\)

#include<bits/stdc++.h>
using namespace std; template <typename Tp>
void read(Tp &x){
x=0;char ch=1;int fh;
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-'){
fh=-1;ch=getchar();
}
else fh=1;
while(ch>='0'&&ch<='9'){
x=(x<<1)+(x<<3)+ch-'0';
ch=getchar();
}
x*=fh;
} const int maxn=107;
const int INF=0x3f3f3f3f; int n,m;
int a[maxn][maxn]; int S,T,d[maxn*maxn];
int Head[maxn*maxn],Next[1000007],v[1000007],tot=1,w[1000007]; int dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
int Iter[maxn*maxn]; void add(int x,int y,int z){
v[++tot]=y,Next[tot]=Head[x],Head[x]=tot,w[tot]=z;
} int calc(int x,int y){//错误笔记:calc写错
return (x-1)*m+y;
} bool check(int x,int y){
if(x>n||x<1||y>m||y<1) return false;
return true;
} int ans; bool bfs(){
memset(d,0,sizeof(d));
queue<int>q;q.push(S);d[S]=1;
while(!q.empty()){
int x=q.front();q.pop();
for(int i=Head[x];i;i=Next[i]){
if(d[v[i]]||!w[i]) continue;
q.push(v[i]);d[v[i]]=d[x]+1;
if(v[i]==T) return true;
}
}
return false;
} int dfs(int x,int flow){
if(x==T) return flow;
int rest=flow;
for(int i=Head[x];i&&rest;i=Next[i]){
if(d[v[i]]!=d[x]+1||!w[i]) continue;
int k=dfs(v[i],min(rest,w[i]));
if(!k) d[v[i]]=0;
else{
w[i]-=k,w[i xor 1]+=k;
rest-=k;
}
}
return flow-rest;
} int main(){
read(n);read(m);
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
read(a[i][j]);
}
}
S=n*m+1,T=S+1;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
int p=calc(i,j);
if(a[i][j]==1){
add(S,p,INF);add(p,S,0);
}
else if(a[i][j]==2){
add(p,T,INF);add(T,p,0);
}
for(int k=0;k<4;k++){
int xx=i+dx[k],yy=j+dy[k];
if(check(xx,yy)){
add(p,calc(xx,yy),1),add(calc(xx,yy),p,0);
}
}
}
}
while(bfs()){
int t;
for(int i=1;i<=n*m;i++) Iter[i]=Head[i];
while(t=dfs(S,0x3f3f3f3f)) ans+=t;
}
printf("%d\n",ans);
return 0;
}

最新文章

  1. jQuery实现全选效果【转】
  2. easyui validatebox 验证类型
  3. ros下多机器人系统(1)
  4. 夺命雷公狗ThinkPHP项目之----企业网站19之网站配置信息的修改
  5. iOS开发之常用路径及文件操作方法
  6. IntelliJ IDEA及maven、git下载与配置
  7. Python练习十
  8. margin-left:-20px
  9. LeetCode--No.006 ZigZag Conversion
  10. Fidder
  11. 3、CSS属性组成和作用
  12. 知乎改版api接口之scrapy自动登陆
  13. intelij idea常用设置
  14. hasattr getattr setattr delattr --&gt; (反射)
  15. 使用NetHogs监控进程网络使用情况
  16. AmazonOrder xml web语义化
  17. Kali渗透测试1-Netcat
  18. 【IIS转】:解决IIS下localhost访问需要输入用户名和密码的问题
  19. 贪心——Prim算法(避圈法)
  20. Python3爬虫(九) 数据存储之关系型数据库MySQL

热门文章

  1. xLua 学习
  2. 【新特性速递】CSS3动画增强
  3. Nginx+Tomcat+Memcache 实现session共享
  4. RabbitMQ如何保证消息99.99%被发送成功?
  5. javascript模块化编程思想、实现与规范
  6. WPF --TextBox--圆角、水印、带单位
  7. DVWA-基于布尔值的盲注与基于时间的盲注学习笔记
  8. internet信息服务(IIS)管理器 在哪里?
  9. C 预处理器、头文件、文件读写
  10. Java面向对象——相关基本定义