Time Limit: 3000MS64bit IO Format: %lld & %llu

网络流 最小割

心生绝望,用了好久的网络流模板居然是错的。

↑居然之前还侥幸能过一堆(并不)题。

______

利用边容量来限制花费:

  边缘的坑必须填上,每格花费为f;

  如果一个地方id是坑,将其填上,从S到id连边,容量为f;

  如果一个地方id是草,在这挖坑,从id到T连边,容量为d;

  建立栅栏:每格向四周连边,容量为b;

↑如此建边起到了限制最小花费的作用,如果挖坑的代价比种草小,挖坑的边先流满,反之同理,求出的最小割就是达成要求的最小花费。

求最小割即可。

第53行 if(!f)dep[u]=0; 作用是当前路径无法扩展时,切断路径,避免重复无意义DFS。

↑以前写dinic一直不知道要加这个,居然没被卡……

 #include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int INF=<<;
const int mxn=;
const int mx[]={,,,-,};
const int my[]={,,,,-};
struct edge{
int v,nxt,f;
}e[];
int hd[mxn],mct=;
int n,m,k,ans;
int id[][];
int S,T;
void add_edge(int u,int v,int c){
e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=c;hd[u]=mct;return;
}
int dep[];
bool BFS(){
queue<int>q;
memset(dep,,sizeof dep);
dep[S]=;
q.push(S);
while(!q.empty()){
int u=q.front();q.pop();
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(!dep[v] && e[i].f){
dep[v]=dep[u]+;
q.push(v);
}
}
}
return dep[T];
}
int DFS(int u,int lim){
if(u==T) return lim;
int tmp,f=;
for(int i=hd[u];i;i=e[i].nxt){
int v=e[i].v;
if(dep[v]==dep[u]+ && e[i].f){
tmp=DFS(v,min(lim,e[i].f));
lim-=tmp;
f+=tmp;
e[i].f-=tmp;
e[i^].f+=tmp;
if(!lim)return f;
}
}
if(!f)dep[u]=;
return f;
}
int Dinic(){
int res=;
while(BFS())res+=DFS(S,1e9);
return res;
}
inline void init(){
memset(hd,,sizeof hd);
for(int i=;i<=n;i++)
for(int j=;j<=m;j++)
id[i][j]=(i-)*m+j;
mct=;
ans=;
return;
}
int d,f,b;
char mp[][];
int main()
{
int cas;
scanf("%d",&cas);
int i,j;
while(cas--){
scanf("%d%d",&m,&n);
scanf("%d%d%d",&d,&f,&b);
init();
S=;T=n*m+;
for(i=;i<=n;i++)scanf("%s",mp[i]+);
for(i=;i<=n;i++)
for(j=;j<=m;j++){
if(i== || i==n || j== || j==m){
if(mp[i][j]=='.')ans+=f;
add_edge(S,id[i][j],INF);
add_edge(id[i][j],S,);
}
else if(mp[i][j]=='#'){
add_edge(S,id[i][j],d);
add_edge(id[i][j],S,);
}
else{
add_edge(id[i][j],T,f);
add_edge(T,id[i][j],);
}
if(i>){
add_edge(id[i][j],id[i-][j],b);add_edge(id[i-][j],id[i][j],);
add_edge(id[i][j],id[i-][j],);add_edge(id[i-][j],id[i][j],b);
}
if(j>){
add_edge(id[i][j],id[i][j-],b);add_edge(id[i][j-],id[i][j],);
add_edge(id[i][j-],id[i][j],b);add_edge(id[i][j],id[i][j-],);
}
}
ans+=Dinic();
printf("%d\n",ans);
}
return ;
}

Uva1515 Pool construction的更多相关文章

  1. UVa1515 Pool construction(最小割)

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

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

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

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

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

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

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

  5. UVa 1515 (最小割) Pool construction

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

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

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

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

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

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

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

  9. Uva -1515 Pool construction(最小割)

    输入一个字符矩阵,'.'代表洞,'#'代表草地.可以把草改成洞花费为d,或者把洞改成草花费为f,最后还要在草和洞之间修围栏花费为b. 首先把最外一圈的洞变成草,并累加花费. 增加一个源点和一个汇点,源 ...

随机推荐

  1. InputStream复用,mark和reset

    markSupported InputStream是否支持mark,默认不支持. public boolean markSupported() { return false; } InputStrea ...

  2. FineUI小技巧(4)关闭窗体那些事

    前言 FineUI中的Window控件常用作选择.新增或编辑内容.而关闭Window控件却有很多技巧,了解这些技巧有助于项目的快速开发. 如何关闭Window控件 第一个问题就是如何关闭Window控 ...

  3. 误人子弟的网络,谈谈HTTP协议中的短轮询、长轮询、长连接和短连接

    引言 最近刚到公司不到一个月,正处于熟悉项目和源码的阶段,因此最近经常会看一些源码.在研究一个项目的时候,源码里面用到了HTTP的长轮询.由于之前没太接触过,因此LZ便趁着这个机会,好好了解了一下HT ...

  4. 完整的社交app源码android+laravel

    等想到写点什么的时候再写吧,其他看代码. https://github.com/huijimuhe/monolog-android https://github.com/huijimuhe/monol ...

  5. socket.io简单说明及在线抽奖demo

    socket.io简单说明及在线抽奖demo socket.io 简介 Socket.IO可以实现实时双向的基于事件的通信. 它适用于各种平台,浏览器或设备,也同样注重可靠性和速度. socket.i ...

  6. ModernUI教程:使用WPF4.0

    Modern UI 同时支持WPF4.0和4.5.下载包中包含了这两个版本的程序集.当你使用Nuget下载时,会根据你选择的运行时版本自动选择对应的版本下载.而Visual Studio2012的模板 ...

  7. 学习Google Protocol buffer之语法

    上一篇结尾的时候问了几个问题,其实主要就是这个protoBuffer协议的语法,弄清楚语法后边才好开展工作嘛,不然大眼而对小眼儿,互相不认识,就没法玩耍了.其实就是学习怎么用google提供的这套 p ...

  8. IIS——发布网站

    当我们要上线一个网站时,不要把整个项目原封不动的发布到服务器,而要经过右键发布后,然后再将发布的文件路径配置到IIS~ 详细信息见链接:http://www.52ij.com/jishu/aspx/1 ...

  9. Golang操作数据库

    基本概念 Open() – creates a DB Close() - closes the DB Query() - 查询 QueryRow() -查询行 Exec() -执行操作,update, ...

  10. Day Seven(Beta)

    站立式会议 站立式会议内容总结 331 今天: 1)阅读html 5+文档 未来走h5路线 2)restful,未来开发接口 3)h5+demo运行 4)get 代码:a||(a=as); 5)js ...