1.题意:

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

2.分析:

问题可以简化一下问题:使得图内点与图外点两部分不联通的最小花费。

可以看出这是典型的最小割问题,所以关键在于怎么建图。图上起点也就是源点,图外点标记为汇点。

把每个点拆为入点和出点,陷阱点处的流量为花费,其他点处为0.

每个点所能到达的点,连接上边,边的容量为INF,这样,从源点向汇点跑网络流。

由最大流=最小割性质可以知:最大流 = 最小花费,若flow==INF,则说明必定联通。

3.代码:

#include <iostream>
#include<bits/stdc++.h>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 5000 + 7;
char str[50][50];
int n,m,k,head[maxn],tot,dist[maxn],Cost[30],s,t,cur[maxn];
int dx[] = {0,0,1,-1};
int dy[] = {1,-1,0,0};
struct Edge{int from,to,next,flow,cap;
}edge[maxn*10];
void addEdge(int a,int b,int c){edge[tot].from = a;edge[tot].to = b;edge[tot].cap = c;edge[tot].flow = 0;edge[tot].next = head[a];head[a] = tot++;edge[tot].from = b;edge[tot].to = a;edge[tot].cap = 0;edge[tot].flow = 0;edge[tot].next = head[b];head[b] = tot++;
}
bool BFS(){memset(dist,0,sizeof(dist));dist[s] = 1;queue<int> que;que.push(s);while(!que.empty()){int p = que.front();que.pop();for(int i = head[p];~i;i = edge[i].next){int to = edge[i].to;if(!dist[to]&&edge[i].cap > edge[i].flow){dist[to] = dist[p] + 1;que.push(to);}}}if(!dist[t])return false;return true;
}
int DFS(int pos,int MinFlow){if(pos==t||MinFlow==0)return MinFlow;int flow = 0;for(int &i = cur[pos];~i;i = edge[i].next){int to = edge[i].to;if(dist[to]==dist[pos]+1&&edge[i].cap > edge[i].flow){int res = DFS(edge[i].to,min(MinFlow,edge[i].cap-edge[i].flow));edge[i].flow+=res;edge[i^1].flow-=res;flow+=res;MinFlow-=res;if(MinFlow==0)break;}}return flow;
}
int Dinic(int st,int et){if(st==et)return 0;int MaxFlow = 0;while(BFS()){for(int i = 0;i<=t;i++)cur[i] = head[i];int ans = DFS(st,INF);if(ans>=INF)return -1;MaxFlow+=ans;}return MaxFlow;
}
int main()
{tot = 0;memset(head,-1,sizeof(head));scanf("%d%d%d",&m,&n,&k);for(int i = 0;i<n;i++)scanf("%s",str[i]);for(int i = 0;i<k;i++){scanf("%d",&Cost[i]);}t = 2*n*m + 100;for(int i = 0;i<n;i++){for(int j = 0;j<m;j++){int id = i*m + j;if(str[i][j]=='B')s = id;if(str[i][j]=='.'||str[i][j]=='B')addEdge(id,id+n*m,INF);else addEdge(id,id+n*m,Cost[str[i][j]-'a']);for(int p = 0;p<4;p++){int fx = i + dx[p];int fy = j + dy[p];if(fx>=0&&fx<n&&fy>=0&&fy<m)addEdge(id+n*m,fx*m + fy,INF);else addEdge(id+n*m,t,INF);}}}printf("%d\n",Dinic(s,t));return 0;
}

Gym - 101982E Cops And Robbers 网络流最小割相关推荐

  1. 【bzoj2521】[Shoi2010]最小生成树 网络流最小割

    题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...

  2. 【bzoj2132】圈地计划 网络流最小割

    题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...

  3. 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化

    题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...

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

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

  5. P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)

    P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...

  6. CodeForces 1517G Starry Night Camping(网络流最小割)

    CodeForces 1517G Starry Night Camping problem 洛谷链接 solution 这个平行四边形的脑洞我™真的长见识了 本题最离谱的要求就是:平行四边形的一条边平 ...

  7. jzoj4020-Revolution【网络流,最小割】

    正题 题目链接:https://jzoj.net/senior/#contest/show/3014/2 题目大意 n∗mn*mn∗m的地方,每个地方有购买价格和收益,一个地方如果四周都被购买那么也可 ...

  8. 图论 —— 网络流 —— 最小割 —— 平面图与对偶图

    [平面图] 对于一个图 G=(V,E),若其重画后,在平面任意两条边的交点除了图中点外,没有其他交点,那么这个图称为平面图 在平面图中,由边包围并且其中不含顶点的区域称为面 包围面 R 的所有边组成的 ...

  9. AcWing2279 网络战争 (01分数规划+网络流 最小割模型)

    原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...

最新文章

  1. sklearn自学指南(part50)--独立成分分析(ICA)
  2. dw怎么做竖线_我花了5分钟,做了一份极“拉风”的PPT
  3. linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
  4. java 返回js_如何基于java或js获取URL返回状态码
  5. ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
  6. 花5000元买2天训练营,年轻人正在「高价买觉睡」
  7. mysql php状态函数_mysql常用的信息函数
  8. python自动视频摘要_专栏丨深度学习之视频摘要简述
  9. unity中使用protobuf-net
  10. ipad iphone开发_如何在iPhone或iPad上强制退出应用程序
  11. 工业面阵相机与源型PLC和漏型PLC外部触发接线
  12. 苹果Mac如何切换大写输入法?
  13. L298N、电机、单片机的线路连接(51、stm32程序)
  14. 张一鸣卸任字节跳动CEO
  15. csv日文乱码问题的解决
  16. 双卡 一卡通话 卡2丢网 ---注册状态 VOICE_REGISTRATION_STATE
  17. 微信小程序使用后台播放器播放音乐
  18. 中亿物联网代理_北京电信物联网卡服务商,首选中亿物联网!【官方渠道】
  19. Django源码cookie解读:关于中文cookie会被吞掉并截断的问题。
  20. 7-158 判断4和7的倍数

热门文章

  1. 炒币碰到熊市的应对方法,炒币者的八大口诀
  2. 尽管HTTP/3已经来了,HTTP/2也得了解啊
  3. Android7.1.1 remap鼠标右键为返回键
  4. 滴滴单通道语音分离与目标说话人提取和抑制技术进展
  5. 《零基础学C语言》光盘内容
  6. 全球营商环境报告及数据(2004-2020年)
  7. Proteus STM32仿真学习板
  8. 高中新课程作业本 地理 必修1 参考答案下
  9. VUE:使用element-ui的el-table时,自定义单元格内容,并tab快速切换指定编辑的单元格,而不是把所有能tab切换的都切换一遍
  10. 地形因子分类整合方案