题目链接

题意:

有一个花园,有些地方是草地,有些地方是洞,现在要在这个花园中修建一个泳池,泳池全部由洞构成。

把洞变成草地需要花费一定的费用,把草地变成洞也需要花费一定的费用,并且泳池的边缘的草地上必须修建防护栏,也需要一定的费用。

花园的边缘地带一定得是草地。

问修建这个泳池的最少花费。

思路:

由于是把洞和草地分开,那么就充当了一个天然的“割”。这个割把草地的点和洞的点分开。

所以从\(S\)向所有除边缘地带的草地连边,容量为对应的费用,表示这个点变成洞需要付出的代价;

从\(S\)向边缘地带的草地和洞连边,容量为inf,表示不可能变成洞,代价为无穷,边缘的洞的费用可以提前计算出来;

从所有的非边缘洞向\(T\)连边,容量为对应的费用,表示把这个点变成草地的代价;

然后相邻的所有点连边,容量为护栏的费用,表示分隔这两个点的代价;

然后求最大流即可,即是最小割,花费的最少费用。

“最小割建图时的边的容量表示割掉这条边需要付出的代价”

代码:

#include <stdio.h>
#include <string.h>
#include <algorithm>
#include <vector>
#include <queue>
using namespace std;
typedef long long ll;
const int inf = 0x3f3f3f3f;
const int N = 55;
const int nei[4][2] = {{0,1},{1,0},{-1,0},{0,-1}}; struct edge
{
int u,v,cap;
edge(){}
edge(int u,int v,int cap):u(u),v(v),cap(cap){}
}; vector<edge> es; char s[N][N];
int mp[N][N];
vector<int> G[N*N];
int S,T; void adde(int u,int v,int cap)
{
es.push_back(edge(u,v,cap));
es.push_back(edge(v,u,0));
int sz = es.size();
G[u].push_back(sz-2);
G[v].push_back(sz-1);
} int dis[N*N],gap[N*N]; void bfs()
{
memset(dis,inf,sizeof(dis));
memset(gap,0,sizeof(gap));
dis[T] = 0;
gap[0] = 1;
queue<int> q;
q.push(T);
while (!q.empty())
{
int u = q.front();
q.pop();
for (int i = 0;i < G[u].size();i++)
{
edge &e = es[G[u][i]];
int v = e.v;
if (dis[v] >= inf)
{
dis[v] = dis[u] + 1;
q.push(v);
gap[dis[v]]++;
}
}
}
} int dfs(int u,int f)
{
if (u == T) return f;
int res = f;
for (int i = 0;i < G[u].size();i++)
{
edge &e = es[G[u][i]];
int v = e.v;
if (dis[u] == dis[v] + 1 && e.cap > 0)
{
int tmp = dfs(v,min(res,e.cap));
if (tmp)
{
res -= tmp;
e.cap -= tmp;
es[G[u][i]^1].cap += tmp;
}
if (!res)
{
return f;
}
}
}
if (!(--gap[dis[u]])) dis[S] = T + 1;
gap[++dis[u]]++;
return f - res;
} int isap()
{
int ans = 0;
bfs();
while (dis[S] < T + 1) ans += dfs(S,inf);
return ans;
} int main()
{
int t;
scanf("%d",&t);
while (t--)
{
int n,m;
S = 0;
memset(mp,-1,sizeof(mp));
es.clear();
for (int i = 0;i <= T;i++) G[i].clear();
scanf("%d%d",&m,&n);
T = n * m + 1;
int d,f,b;
scanf("%d%d%d",&d,&f,&b);
int ans = 0;
for (int i = 1;i <= n;i++)
{
scanf("%s",s[i] + 1);
}
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= m;j++)
{
mp[i][j] = (i-1) * m + j; if (i == 1 || j == m || i == n || j == 1)
{
if (s[i][j] == '.')
{
adde(S,mp[i][j],inf);
ans += f;
}
else
{
adde(S,mp[i][j],inf);
}
}
else
{
if (s[i][j] == '.')
{
adde(mp[i][j],T,f);
}
else
{
adde(S,mp[i][j],d);
}
}
}
}
for (int i = 1;i <= n;i++)
{
for (int j = 1;j <= m;j++)
{
for (int k = 0;k < 4;k++)
{
int x = i + nei[k][0],y = j + nei[k][1];
int id = mp[x][y];
if (id == -1) continue;
adde(mp[i][j],id,b);
}
}
}
ans += isap();
printf("%d\n",ans);
}
return 0;
} /*
3
3 3
5 5 1
#.#
#.#
###
5 4
1 8 1
#..##
##.##
#.#.#
#####
2 2
27 11 11
#.
.#
*/

uvalive 5905 Pool construction的更多相关文章

  1. UVALive 5905 Pool Construction 最小割,s-t割性质 难度:3

    https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_probl ...

  2. UVa1515 Pool construction(最小割)

    题目 Source https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_pr ...

  3. UVA 1515 Pool construction 最大流跑最小割

    Pool construction You are working for the International Company for Pool Construction, a constructio ...

  4. UVa 1515 (最小割) Pool construction

    题意: 输入一个字符矩阵,'.'代表洞,'#'代表草地.可以把草改成洞花费为d,或者把洞改成草花费为f,最后还要在草和洞之间修围栏花费为b. 但要保证最外一圈是草,求最小费用. 分析: 还不是特别理解 ...

  5. Uva1515 Pool construction

    Time Limit: 3000MS64bit IO Format: %lld & %llu 网络流 最小割 心生绝望,用了好久的网络流模板居然是错的. ↑居然之前还侥幸能过一堆(并不)题. ...

  6. UVA 1515 Pool construction 水塘(最大流,经典)

    题意: 给一个h*w的矩阵,每个格子中是'#'和'.'两个符号之一,分别代表草和洞.现在要将洞给围起来(将草和洞分离),每条边需花费b元(即将一个洞包起来需要4边,将2个连续的洞包起来需要6边,省了2 ...

  7. UVA-1515 Pool construction (最小割)

    题目大意:有一块地,分成nxm块.有的块上长着草,有的块上是荒地.将任何一块长着草的块上的草拔掉都需要花费d个力气,往任何一块荒地上种上草都需要花费f个力气,在草和荒地之间架一个篱笆需要花费b个力气, ...

  8. UVa 1515 - Pool construction(最小割)

    链接: https://uva.onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem& ...

  9. UVA1515 Pool construction (最小割模型)

    如果不允许转化'#'和'.'的话,那么可以直接在'#'和'.'之间连容量为b的边,把所有'#'和一个源点连接, 所有'.'和一个汇点连接,流量不限,那么割就是建围栏(分割'#'和'.')的花费. 问题 ...

随机推荐

  1. curl and wget

    写在前面: a.  对比curl 和 wget 的相同和不同点 来记忆 a-1 curl url  直接将请求内容输出到标准输出. 如果下载不是瞬时间完成,会显示下载进度条,如果向取消,加-s : w ...

  2. SpringCloud学习(SPRINGCLOUD微服务实战)一

    SpringCloud学习(SPRINGCLOUD微服务实战) springboot入门 1.配置文件 1.1可以自定义参数并在程序中使用 注解@component @value 例如 若配置文件为a ...

  3. Django-DRF(1)

    一. WEB应用模式 在开发Web应用中,有两种应用模式: 1. 前后端不分离 2. 前后端分离 二. API接口 为了在团队内部形成共识.防止个人习惯差异引起的混乱,我们需要找到一种大家都觉得很好的 ...

  4. 并查集 --cogs456 岛国

    题目链接:http://cogs.pro:8081/cogs/problem/problem.php?pid=pNyNQiqge 思路: 基础是并查集,将两个相邻的岛算作一个集合,每次若合并成功,则N ...

  5. 【计算机视觉】极限优化:Haar特征的另一种的快速计算方法—boxfilter

    这种以Boxfilter替代integral image 的方法很难使用到haar.LBP等特征检测中,因为像下面说的,它不支持多尺度,也就是说所提取的特征必须是同一个大小,最起码同一个宽高比的,这一 ...

  6. JVM 分析工具和查看命令,超详细

    jinfo 可以输出并修改运行时的java 进程的opts. jps 与unix上的ps类似,用来显示本地的java进程,可以查看本地运行着几个java程序,并显示他们的进程号. jstat 一个极强 ...

  7. c++学习笔记之类模板

    C++ 除了支持函数模板,还支持类模板(Class Template).函数模板中定义的类型参数可以用在函数声明和函数定义中,类模板中定义的类型参数可以用在类声明和类实现中.类模板的目的同样是将数据的 ...

  8. gin框架博客实战教程2019web页面开发go语言实战博客开发

    视频教程: https://www.bilibili.com/video/av73698322?t=2400&p=5 资料下载地址(含数据库和main.go和controller里的代码) 注 ...

  9. 协议相关(HTTP,TCP,webservice,socket)

    什么是协议? 我们常常点开的链接(URL)就有HTTP.HTTPS协议 枯燥点的知识(协议模型) HTTP,webservice都是在<TCP/IP协议>的应用层. TCP,socket在 ...

  10. Leaf Sets CodeForces - 1042F (树,最小划分)

    大意: 给定树, 求叶子的最小划分, 使得每个划分内任意两个叶子距离不超过k. 任选一个非叶结点, 贪心合并. #include <iostream> #include <sstre ...