Uva1515 Pool construction

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一直不知道要加这个,居然没被卡……

  1 #include<iostream>
  2 #include<cstdio>
  3 #include<algorithm>
  4 #include<cstring>
  5 #include<queue>
  6 using namespace std;
  7 const int INF=1<<29;
  8 const int mxn=3500;
  9 const int mx[5]={0,1,0,-1,0};
 10 const int my[5]={0,0,1,0,-1};
 11 struct edge{
 12     int v,nxt,f;
 13 }e[100010];
 14 int hd[mxn],mct=1;
 15 int n,m,k,ans;
 16 int id[120][120];
 17 int S,T;
 18 void add_edge(int u,int v,int c){
 19     e[++mct].v=v;e[mct].nxt=hd[u];e[mct].f=c;hd[u]=mct;return;
 20 }
 21 int dep[4000];
 22 bool BFS(){
 23     queue<int>q;
 24     memset(dep,0,sizeof dep);
 25     dep[S]=1;
 26     q.push(S);
 27     while(!q.empty()){
 28         int u=q.front();q.pop();
 29         for(int i=hd[u];i;i=e[i].nxt){
 30             int v=e[i].v;
 31             if(!dep[v] && e[i].f){
 32                 dep[v]=dep[u]+1;
 33                 q.push(v);
 34             }
 35         }
 36     }
 37     return dep[T];
 38 }
 39 int DFS(int u,int lim){
 40     if(u==T) return lim;
 41     int tmp,f=0;
 42     for(int i=hd[u];i;i=e[i].nxt){
 43         int v=e[i].v;
 44         if(dep[v]==dep[u]+1 && e[i].f){
 45             tmp=DFS(v,min(lim,e[i].f));
 46             lim-=tmp;
 47             f+=tmp;
 48             e[i].f-=tmp;
 49             e[i^1].f+=tmp;
 50             if(!lim)return f;
 51         }
 52     }
 53     if(!f)dep[u]=0;
 54     return f;
 55 }
 56 int Dinic(){
 57     int res=0;
 58     while(BFS())res+=DFS(S,1e9);
 59     return res;
 60 }
 61 inline void init(){
 62     memset(hd,0,sizeof hd);
 63     for(int i=1;i<=n;i++)
 64      for(int j=1;j<=m;j++)
 65          id[i][j]=(i-1)*m+j;
 66     mct=1;
 67     ans=0;
 68     return;
 69 }
 70 int d,f,b;
 71 char mp[120][120];
 72 int main()
 73 {
 74     int cas;
 75     scanf("%d",&cas);
 76     int i,j;
 77     while(cas--){
 78         scanf("%d%d",&m,&n);
 79         scanf("%d%d%d",&d,&f,&b);
 80         init();
 81         S=0;T=n*m+2;
 82         for(i=1;i<=n;i++)scanf("%s",mp[i]+1);
 83         for(i=1;i<=n;i++)
 84             for(j=1;j<=m;j++){
 85                 if(i==1 || i==n || j==1 || j==m){
 86                     if(mp[i][j]==‘.‘)ans+=f;
 87                     add_edge(S,id[i][j],INF);
 88                     add_edge(id[i][j],S,0);
 89                 }
 90                 else if(mp[i][j]==‘#‘){
 91                     add_edge(S,id[i][j],d);
 92                     add_edge(id[i][j],S,0);
 93                 }
 94                 else{
 95                     add_edge(id[i][j],T,f);
 96                     add_edge(T,id[i][j],0);
 97                 }
 98                 if(i>1){
 99                     add_edge(id[i][j],id[i-1][j],b);add_edge(id[i-1][j],id[i][j],0);
100                     add_edge(id[i][j],id[i-1][j],0);add_edge(id[i-1][j],id[i][j],b);
101                 }
102                 if(j>1){
103                     add_edge(id[i][j],id[i][j-1],b);add_edge(id[i][j-1],id[i][j],0);
104                     add_edge(id[i][j-1],id[i][j],b);add_edge(id[i][j],id[i][j-1],0);
105                 }
106             }
107         ans+=Dinic();
108         printf("%d\n",ans);
109     }
110     return 0;
111 }
时间: 2024-10-05 20:41:24

Uva1515 Pool construction的相关文章

UVa1515 Pool construction (最小割)

链接:http://vjudge.net/problem/UVA-1515 分析:首先分析一个特例,如果草地“#”和洞“.”不允许相互转化,那么我们可以直接从草地‘#”出发向图中相邻洞格子“.”连一条容量为b的弧,源点S向所有草地“#”连一条弧,所有洞“.”向汇点T连一条弧,容量均为无穷大,那么最小割就是建围栏的总费用. 这道题在上述基础上加了草地和洞可以相互转化这一条件.根据刚才的思路,我们可以联想到,只要草地“#”转化成洞“.”的时候,就不需要在它和周围的洞“.”之间建围栏了,那么我们可以限

UVa 1515 (最小割) Pool construction

题意: 输入一个字符矩阵,'.'代表洞,'#'代表草地.可以把草改成洞花费为d,或者把洞改成草花费为f,最后还要在草和洞之间修围栏花费为b. 但要保证最外一圈是草,求最小费用. 分析: 还不是特别理解紫书上的讲解.. 首先把最外一圈的洞变成草,并累加花费. 增加一个源点和一个汇点,源点连接每个草地,汇点连接每个洞. 源点与最外一圈的草地连一条容量无穷大的边,与其他草地连一条容量为d的边.表示把这条弧切断,割的容量增加d,草就会变成洞. 每个洞与汇点连一条容量为f的边. 相邻两个格子之间连一条双向

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

https://icpcarchive.ecs.baylor.edu/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=3916 这道题要求一种填充+挖坑+建屏障的方法,使得这块土地上的所有坑和草地之间都有屏障,挖坑花费d每块,填充花费f每块,建屏障花费b每两块之间,注意并不要求一定有坑,但是外围一圈要一定没有坑,所以需要预先填充好 令st代表平地,ed代表坑,边权为花费,那么本题是要求一个st-

Uva -1515 Pool construction(最小割)

输入一个字符矩阵,'.'代表洞,'#'代表草地.可以把草改成洞花费为d,或者把洞改成草花费为f,最后还要在草和洞之间修围栏花费为b. 首先把最外一圈的洞变成草,并累加花费. 增加一个源点和一个汇点,源点连接每个草地,汇点连接每个洞. 源点与最外一圈的草地连一条容量无穷大的边,与其他草地连一条容量为d的边.表示把这条弧切断,割的容量增加d,草就会变成洞. 每个洞与汇点连一条容量为f的边. 相邻两个格子之间连一条双向边. 用最大流算法求最小割在加上之前把边界上的洞变成草的费用,就是最小花费. 用最小

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

题意:给一个h*w的矩阵,每个格子中是'#'和'.'两个符号之一,分别代表草和洞.现在要将洞给围起来(将草和洞分离),每条边需花费b元(即将一个洞包起来需要4边,将2个连续的洞包起来需要6边,省了2条边).有个特殊能力,能将洞变成草,花费f.当然也能将草变成洞,花费d.围起洞来需要多少花费.矩阵四周最边边的格子都必须是草,即出现洞就必须转草. 转换:洞--->草--->洞  f   d   元/格 围洞: b元/边. 分析:如果能够尽量让洞都靠在一起,那肯定是最小花费,因为少了很多条边.但是转

poj3352Road Construction 边双连通+伪缩点

/* 对于边双连通分支,求法更为简单.只需在求出所有的桥以后,把桥边删除,原图变成了多个连通块,则每个连通块就是一个边双连通分支.桥不属于任何 一个边双连通分支,其余的边和每个顶点都属于且只属于一个边双连通分支. 一个有桥的连通图,如何把它通过加边变成边双连通图?方法为首先求出所有的桥, 然后删除这些桥边,剩下的每个连通块都是一个双连通子图.把每个双连通子图收缩为一个顶点, 再把桥边加回来,最后的这个图一定是一棵树,边连通度为1. 统计出树中度为1的节点的个数,即为叶节点的个数,记为leaf.则

Whether Thread Pool is Needed for You?

你到底需不需要内存池? 先问自己两个问题: 是否有很多请求需要重复性的进行处理? 而且每个请求是相互独立的? 你是否需要等待IO操作,或是文件操作? 如果你回答YES,那么你需要一个线程池来帮助你. 我们为什么需要内存池? 通常情况下,IO操作都会需要很长的一段时间才能完成.所以,在一个单线程的应用程序中,在IO操作期间,系统资源都会进行等待.如果使用多线程,效率就会大大的提高.所以我们需要线程池更高效的完成多线程操作. 内存池会有什么样的作用? 一个应用程序其实应该避免频繁的创建和销毁线程.

buffer cache 和shared pool 详解(之三,shared pool原理)

[深入解析--eygle] 学习笔记 1.2 shared pool原理 Shared Pool是Oracle SGA设置中最复杂也是最重要的一部分内容,Oracle通过Shared Pool来实现SQL共享.减少代码硬解析等,从而提高数据库的性能.在某些版本中,如果设置不当,Shared Pool可能会极大影响数据库的正常运行. 在Oracle 7之前,Shared Pool并不存在,每个Oracle连接都有一个独立的Server进程与之相关联,Server进程负责解析和优化所有SQL和PL/

Tomcat JDBC Pool使用说明

Maven依赖 <dependency>   <groupId>org.apache.tomcat</groupId>   <artifactId>tomcat-jdbc</artifactId>   <version>8.5.9</version> </dependency> 最新版本为9.0,推荐使用8.5.9稳定版 常用配置 连接池配置项很多,下面只列出了推荐配置,项目组可根据自身情况进行增减 <b