Gym - 101982E Cops And Robbers 网络流最小割
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 网络流最小割相关推荐
- 【bzoj2521】[Shoi2010]最小生成树 网络流最小割
题目描述 Secsa最近对最小生成树问题特别感兴趣.他已经知道如果要去求出一个n个点.m条边的无向图的最小生成树有一个Krustal算法和另一个Prim的算法.另外,他还知道,某一个图可能有多种不同的 ...
- 【bzoj2132】圈地计划 网络流最小割
题目描述 最近房地产商GDOI(Group of Dumbbells Or Idiots)从NOI(Nuts Old Idiots)手中得到了一块开发土地.据了解,这块土地是一块矩形的区域,可以纵横划 ...
- 洛谷 P1646 [国家集训队]happiness 网络流 最小割 Dinic+当前弧优化
题目链接: https://www.luogu.com.cn/problem/P1646 参考博客: https://siyuan.blog.luogu.org/solution-p1646 算法:网 ...
- ural 1277. Cops and Thieves【最小割】
ural 1277. Cops and Thieves[最小割] 分类: [图论专辑]2010-07-28 00:00 210人阅读 评论(2) 收藏 举报 /* 小偷要从S城市到T城市偷东西,每 ...
- P4897 【模板】最小割树(Gomory-Hu Tree)(网络流/最小割/树形结构)
P4897 [模板]最小割树(Gomory-Hu Tree) 这个算法可以用来求解一个无向图上任意两点的最小割,具体过程就是每次选择两个点求最小割,然后在一个新图中这两个点连边,然后对于这两个点的连通 ...
- CodeForces 1517G Starry Night Camping(网络流最小割)
CodeForces 1517G Starry Night Camping problem 洛谷链接 solution 这个平行四边形的脑洞我™真的长见识了 本题最离谱的要求就是:平行四边形的一条边平 ...
- jzoj4020-Revolution【网络流,最小割】
正题 题目链接:https://jzoj.net/senior/#contest/show/3014/2 题目大意 n∗mn*mn∗m的地方,每个地方有购买价格和收益,一个地方如果四周都被购买那么也可 ...
- 图论 —— 网络流 —— 最小割 —— 平面图与对偶图
[平面图] 对于一个图 G=(V,E),若其重画后,在平面任意两条边的交点除了图中点外,没有其他交点,那么这个图称为平面图 在平面图中,由边包围并且其中不含顶点的区域称为面 包围面 R 的所有边组成的 ...
- AcWing2279 网络战争 (01分数规划+网络流 最小割模型)
原题链接:AcWing2279 网络战争 题目大意 给一个无向带权图,求将s和t分开的一个边割集,使得割集的平均边权最小,即最小化∑e∈cwe∣c∣\frac{\sum_{e\in c} w_e}{| ...
最新文章
- sklearn自学指南(part50)--独立成分分析(ICA)
- dw怎么做竖线_我花了5分钟,做了一份极“拉风”的PPT
- linux进程的高级管理,Linux高级程序设计(第2版) PDF扫描版[94MB]
- java 返回js_如何基于java或js获取URL返回状态码
- ROS 学习笔记(二):自定义消息msg+Publisher+Subscriber 示例运行
- 花5000元买2天训练营,年轻人正在「高价买觉睡」
- mysql php状态函数_mysql常用的信息函数
- python自动视频摘要_专栏丨深度学习之视频摘要简述
- unity中使用protobuf-net
- ipad iphone开发_如何在iPhone或iPad上强制退出应用程序
- 工业面阵相机与源型PLC和漏型PLC外部触发接线
- 苹果Mac如何切换大写输入法?
- L298N、电机、单片机的线路连接(51、stm32程序)
- 张一鸣卸任字节跳动CEO
- csv日文乱码问题的解决
- 双卡 一卡通话 卡2丢网 ---注册状态 VOICE_REGISTRATION_STATE
- 微信小程序使用后台播放器播放音乐
- 中亿物联网代理_北京电信物联网卡服务商,首选中亿物联网!【官方渠道】
- Django源码cookie解读:关于中文cookie会被吞掉并截断的问题。
- 7-158 判断4和7的倍数