题目链接<http://codeforces.com/gym/240837>


题意:

给你一张地图,里面有一个小偷。要求建造一些围栏把小偷圈住,有些地方不可造围栏,有些地方可造,但代价不同。问最少的代价是多少。


题解:

想到最小割就好做了。对于每个点拆成两个点,中间连一条边,使得点权变成边权,这样跑一遍就出来了。

注意n和m是反的。


#include<cstdio>
#include<cstring>
#include<queue>
#include<cmath>
#include<iostream>
using namespace std;
typedef long long ll;
const ll N=3e3+7;
const ll inf=1<<30;
struct Edge{ll u,v,w,nxt;Edge(ll u=0,ll v=0,ll w=0,ll nxt=0):u(u),v(v),w(w),nxt(nxt){}
}edge[N*4];
ll edn,sp,tp;
ll p[N],d[N],c[N];
void add(ll u,ll v,ll w){edge[++edn]=Edge(u,v,w,p[u]);p[u]=edn;edge[++edn]=Edge(v,u,0,p[v]);p[v]=edn;
}
bool bfs(){memset(d,-1,sizeof(d));d[sp]=0;queue<ll>q;q.push(sp);while(!q.empty()){ll u=q.front();q.pop();for(ll i=p[u];~i;i=edge[i].nxt){ll v=edge[i].v;if(d[v]==-1&&edge[i].w){d[v]=d[u]+1;q.push(v);if(v==tp) return true;}}}return ~d[tp];
}
ll dfs(ll u,ll b){if(u==tp) return b;ll r=0;for(ll i=c[u];~i;i=edge[i].nxt){ll v=edge[i].v;if(edge[i].w&&d[v]==d[u]+1){ll x=min(edge[i].w,b-r);c[u]=i;x=dfs(v,x);r+=x;edge[i].w-=x;edge[i^1].w+=x;if(r==b) break;}}if(!r)d[u]=-2;return r;
}
ll dinic(){ll total=0,t;while(bfs()){memcpy(c,p,sizeof(p));while(t=dfs(sp,inf))total+=t;}return total;
}
ll n,m,cc;
char s[50][50];
ll cs[50];
ll dir[4][2]={1,0,0,1,-1,0,0,-1};
int main()
{memset(p,-1,sizeof(p));edn=-1;scanf("%lld%lld%lld",&m,&n,&cc);for(ll i=0;i<n;i++){scanf("%s",s[i]);}for(ll i=0;i<cc;i++){scanf("%lld",&cs[i]);}sp=2*n*m+100,tp=sp+1;for(ll i=0;i<n;i++){for(ll j=0;j<m;j++){ll u=i*m+j;if(s[i][j]=='.'||s[i][j]=='B') add(u,u+n*m,inf);else add(u,u+n*m,cs[s[i][j]-'a']);for(ll k=0;k<4;k++){ll di=dir[k][0]+i;ll dj=dir[k][1]+j;if(di<0||di>=n||dj<0||dj>=m) add(u+n*m,tp,inf);else{ll v=di*m+dj;add(u+n*m,v,inf);}}if(s[i][j]=='B') add(sp,u,inf);}}ll ans=dinic();if(ans>=inf) printf("-1");else printf("%lld\n",ans);return 0;
}

【最小割】Gym - 101982 - E - Cops And Roobers相关推荐

  1. Gym - 101982E Cops And Robbers 网络流最小割

    1.题意: 输入一个n行m列的地图,地图上有k种陷阱底座,每种陷阱必须放在相应底座上,并且有一定的花费.有一只兔子初始位置在'B'处,为了使这只兔子不能逃出地图,必须放置一些陷阱来阻拦它.问怎么样放置 ...

  2. ural 1277. Cops and Thieves【最小割】

    ural 1277. Cops and Thieves[最小割] 分类: [图论专辑]2010-07-28 00:00 210人阅读 评论(2) 收藏 举报 /*   小偷要从S城市到T城市偷东西,每 ...

  3. Cops and Robbers(最大流 最小割)

    https://vjudge.net/problem/Kattis-copsandrobbers 题意: 将某些位置堵上,不能使得B出去,不同字母不同花费,求最小花费. 解析: 使B与外面分离,就是最 ...

  4. Ural 1277 Cops and Thieves(最小点割集/最小割)

    题意:一个团伙去偷一个美术馆,警察决定在路上堵截.警察人数为k,不能在贼窝和美术馆驻扎,只能在图上其他点驻扎,而且驻扎有一个最小人数要求,问警察能否完成任务. 解法:又是最小点割集题目,每个点拆点即可 ...

  5. Cops And Roobers

    题目链接:Cops And Roobers 直接建图,拆点最小割就好了,没什么难度. AC代码: #pragma GCC optimize("-Ofast","-funr ...

  6. S-T平面图中利用最短路求最小割(BZOJ 1001)

    BZOJ 1001: [BeiJing2006]狼抓兔子 最小割 题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1001 现在小朋友们最喜欢 ...

  7. [学习笔记]最小割之最小点权覆盖最大点权独立集

    最小点权覆盖 给出一个二分图,每个点有一个非负点权 要求选出一些点构成一个覆盖,问点权最小是多少 建模: S到左部点,容量为点权 右部点到T,容量为点权 左部点到右部点的边,容量inf 求最小割即可. ...

  8. POJ 1966 Cable TV Network【无向图点连通度 最小割 E-K算法求最大流】

    题目描述: 给你一个无向图,问你最少删掉几个点,使这个图成不连通. 解题报告: 概念 (1)一个具有 N 个顶点的图,在去掉任意 k-1 个顶点后 (1<=K<=N) 所得的子图仍连通, ...

  9. 最小割 ---- 2021 ccpc 威海 H city-safety(最大利润 = 最大收益 - 最小花费(最小割))

    题目链接 题目大意: 一棵树,加强第 iii 个点有 wiw_iwi​ 的花费,而如果距离某 个点 ≤p≤ p≤p 的所有点都加强了,则会有 vpv_pvp​ 的收益,求最大净收益. 解题思路: 树形 ...

最新文章

  1. 微软CEO纳德拉对话沈向洋:那些未来可期的计算机视觉研究与应用
  2. 基于DotNet构件技术的企业级敏捷软件开发平台 - AgileEAS.NET - 插件标记实现
  3. 【C语言入门学习笔记】如何把C语言程序变成可执行文件!
  4. 浅谈移动互联网广告设计评论
  5. Linux下载Java包,Linux环境Java包的安装和环境配置
  6. python二元一次方程组用鸡兔同笼的思路来写编程_3 应用二元一次方程组——鸡兔同笼 教学设计...
  7. 内存卡坏了怎么修复?内存卡恢复也不难
  8. ubuntu16.04+Titan Xp的驱动官网上找不到
  9. 纯HTML5后台模板
  10. 记一次Godaddy域名解析托管到AWS的Route53操作
  11. 变异系数在线计算机,数理统计在线计算器
  12. 花呗、信用卡哪个用起来更方便?
  13. Publish/SubScribe(发布/订阅)模式
  14. 人工智能产业盛宴:2019 AIIA开发者大会即将揭幕
  15. 6D姿态估计算法汇总
  16. 史上最全开启windows7(win7)虚拟wifi教程(上)
  17. Java Web基础概述
  18. 8QAM 调制解调 代码
  19. matplotlib 绘制曲线的线型,颜色,形状
  20. 如何区分客户端是手机端还是PC端

热门文章

  1. 但是生活不止眼前的苟且
  2. wxWidgets 编译安装
  3. 计算机英语e-mail是什么词,e-mail是指什么?
  4. 持续集成回顾暨点滴分享[4] – 静态代码检查,单元测试好基友!
  5. php 数字0补位,字符串空格补位
  6. 如何向领导汇报工作(2)
  7. NV专供OEM使用主流DX11显卡GT440发布!
  8. 安卓手机也可以使用新必应NewBing
  9. win8.1中文旗舰版输入法默认英文
  10. 开源SSO单点登录认证系统